=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
When you save the notebook, an HTML file containing the code and
output will be saved alongside it (click the Preview button or
press Cmd+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the
editor. Consequently, unlike Knit, Preview does not
run any R code chunks. Instead, the output of the chunk when it was last
run in the editor is displayed.
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
=======
>>>>>>> Stashed changes
Checking Effectiveness of Imputation Method
<<<<<<< Updated upstream
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
<<<<<<< Updated upstream
=======
<<<<<<< HEAD
# Data of Wave 5
WV5_data <- readRDS("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/F00007944-WV5_Data_R_v20180912.rds")
# Convert WV5_data-object in data.frame
WV5_data_df <- as.data.frame(WV5_data)
# show first five columns
WV5_data_df
<<<<<<< HEAD
=======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
<<<<<<< Updated upstream
=======
<<<<<<< HEAD
#rename the variables
WV5_data <- WV5_data_df %>%
rename(gender = V235, age = V237, country_code = V2, wave = V1, risktaking = V86, children = V56, married = V55, employed = V241, education = V238)
<<<<<<< HEAD
WV5_data
colnames(WV5_data)
#select only the variables of interest
=======
WV5_data
colnames(WV5_data)
[1] "wave" "V1A" "V1B" "country_code" "V2A" "V3" "V4" "V4_CO" "V5"
[10] "V5_CO" "V6" "V6_CO" "V7" "V7_CO" "V8" "V8_CO" "V9" "V9_CO"
[19] "V10" "V11" "V12" "V13" "V14" "V15" "V16" "V17" "V18"
[28] "V19" "V20" "V21" "V22" "V23" "V24" "V25" "V26" "V27"
[37] "V28" "V29" "V30" "V31" "V32" "V33" "V34" "V35" "V36"
[46] "V37" "V38" "V39" "V40" "V41" "V42" "V43" "V43_01" "V43_02"
[55] "V43_03" "V43_04" "V43_05" "V43_06" "V43_07" "V43_08" "V43_09" "V43_10" "V43_11"
[64] "V43_12" "V43_13" "V43_14" "V43_15" "V43_16" "V43_17" "V43_18" "V43_19" "V43_20"
[73] "V43_21" "V43_22" "V43_23" "V43_24" "V43_25" "V43_26" "V43_27" "V43_28" "V43_29"
[82] "V43_30" "V44" "V45" "V46" "V47" "V48" "V49" "V50" "V51"
[91] "V52" "V53" "V54" "married" "children" "V57" "V58" "V59" "V60"
[100] "V61" "V62" "V63" "V64" "V65" "V66" "V67" "V68" "V69"
[109] "V69_HK" "V70" "V70_HK" "V71" "V72" "V73" "V73_HK" "V74" "V74_HK"
[118] "V75" "V76" "V77" "V78" "V79" "V80" "V81" "V82" "V83"
[127] "V84" "V85" "risktaking" "V87" "V88" "V89" "V90" "V91" "V92"
[136] "V93" "V94" "V95" "V96" "V97" "V98" "V99" "V100" "V101"
[145] "V102" "V103" "V104" "V105" "V106" "V107" "V108" "V109" "V110"
[154] "V111" "V112" "V113" "V114" "V115" "V116" "V117" "V118" "V119"
[163] "V120" "V121" "V122" "V123" "V124" "V125" "V126" "V127" "V128"
[172] "V129" "V130" "V130_CA_1" "V130_IQ_1" "V130_IQ_2" "V130_IQ_3" "V130_IQ_4" "V130_NZ_1" "V130_NZ_2"
[181] "V131" "V132" "V133" "V134" "V135" "V136" "V137" "V138" "V139"
[190] "V140" "V141" "V142" "V143" "V144" "V145" "V146_00" "V146_01" "V146_02"
[199] "V146_03" "V146_04" "V146_05" "V146_06" "V146_07" "V146_08" "V146_09" "V146_10" "V146_11"
[208] "V146_12" "V146_13" "V146_14" "V146_15" "V146_16" "V146_17" "V146_18" "V146_19" "V146_20"
[217] "V146_21" "V146_22" "V147" "V148" "V149" "V150" "V151" "V151_IQ_A" "V151_IQ_B"
[226] "V152" "V153" "V154" "V155" "V156" "V157" "V158" "V159" "V160"
[235] "V161" "V162" "V163" "V164" "V165" "V166" "V167" "V168" "V169"
[244] "V170" "V171" "V172" "V173" "V174" "V175" "V176" "V177" "V178"
[253] "V179" "V180" "V181" "V182" "V183" "V184" "V185" "V186" "V187"
[262] "V188" "V189" "V190" "V191" "V192" "V193" "V194" "V195" "V196"
[271] "V197" "V198" "V199" "V200" "V201" "V202" "V203" "V204" "V205"
[280] "V206" "V207" "V208" "V209" "V210" "V211" "V212" "V213A" "V213B"
[289] "V213C" "V213D" "V213E" "V213F" "V213G" "V213H" "V213K" "V213L" "V213M"
[298] "V213N" "V214" "V215" "V216" "V217" "V218" "V219" "V220" "V221"
[307] "V222" "V223" "V224" "V225" "V226" "V227" "V228" "V229" "V230"
[316] "V231" "V232" "V233" "V233A" "V234" "gender" "V236" "age" "education"
[325] "V238CS" "V239" "V240" "employed" "V242" "V242A_CO" "V243" "V244" "V245"
[334] "V246" "V247" "V248" "V249" "V250" "V251" "V252" "V252B" "V253"
[343] "V253CS" "V254" "V255" "V255CS" "V256" "V257" "V257B" "V257C" "V258"
[352] "V259" "V259A" "V260" "V261" "V262" "V263" "V264" "V265" "S024"
[361] "S025" "Y001" "Y002" "Y003" "SACSECVAL" "SECVALWGT" "RESEMAVAL" "WEIGHTB" "I_AUTHORITY"
[370] "I_NATIONALISM" "I_DEVOUT" "DEFIANCE" "WEIGHT1A" "I_RELIGIMP" "I_RELIGBEL" "I_RELIGPRAC" "DISBELIEF" "WEIGHT2A"
[379] "I_NORM1" "I_NORM2" "I_NORM3" "RELATIVISM" "WEIGHT3A" "I_TRUSTARMY" "I_TRUSTPOLICE" "I_TRUSTCOURTS" "SCEPTICISM"
[388] "WEIGHT4A" "I_INDEP" "I_IMAGIN" "I_NONOBED" "AUTONOMY" "WEIGHT1B" "I_WOMJOB" "I_WOMPOL" "I_WOMEDU"
[397] "EQUALITY" "WEIGHT2B" "I_HOMOLIB" "I_ABORTLIB" "I_DIVORLIB" "CHOICE" "WEIGHT3B" "I_VOICE1" "I_VOICE2"
[406] "I_VOI2_00" "VOICE" "WEIGHT4B" "S001" "S007" "S018" "S019" "S021" "COW"
#select only the variables of interest
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
WV5_data <- WV5_data %>%
dplyr::select(gender, age, country_code, wave, risktaking, children, married, employed, education)
WV5_data
<<<<<<< HEAD
# Read countrynames data from the CSV file (to decode the dataset 5)
countrynames <- read.csv("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/countrynames.txt", header = FALSE, as.is = TRUE)
colnames(countrynames) <- c("code", "name")
# Assuming WV5_data has a column named country_code
WV5_data$country <- countrynames$name[match(WV5_data$country_code, countrynames$code)]
# Check the frequency of each country in the new column
table(WV5_data$country)
# Display the updated WV5_data
print(WV5_data)
=======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
#Read Dataset (Wave 6)
WV6_data <- load("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/WV6_Data_R_v20201117.rdata")
WV6_data <- WV6_Data_R_v20201117
print(WV6_data)
<<<<<<< HEAD
=======
#Read Dataset (Wave 6)
WV6_data <- load("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/WV6_Data_R_v20201117.rdata")
WV6_data <- WV6_Data_R_v20201117
print(WV6_data)
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
<<<<<<< Updated upstream
=======
<<<<<<< HEAD
WV6_data <- WV6_data %>%
rename(wave = V1, gender = V240, age = V242,country_code = V2, risktaking = V76, children = V58, married = V57, employed = V229, education = V248)
#select only the variables of interest
WV6_data <- WV6_data %>%
dplyr::select(wave, gender, age, country_code,risktaking, children, married, employed, education)
WV6_data
countrynames = read.csv("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/countrynames.txt", header=FALSE,as.is=TRUE)
colnames(countrynames) = c("code", "name")
WV6_data$country = countrynames$name [match(WV6_data$country_code, countrynames$code)]
table(WV6_data$country)
WV6_data
<<<<<<< HEAD
WV5_data
WV6_data
WVS_data = rbind(WV5_data, WV6_data)
WVS_data
unique(WVS_data$age)
range(WVS_data$age)
=======
WVS_data = rbind(WV5_data, WV6_data)
WVS_data
country_counts <- WVS_data %>%
count(country)
# Print the result
print(country_counts)
NA
NA
NA
NA
NA
NA
NA
NA
NA
NA
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
WVS_data = subset(WVS_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
data_Wave5 = subset(WV5_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
data_Wave6 = subset(WV6_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
WVS_data <- na.omit(WVS_data)
data_Wave5 <- na.omit(data_Wave5)
data_Wave6 <- na.omit(data_Wave6)
# Use the mutate function to change the country name
WVS_data <- WVS_data %>%
mutate(country = ifelse(country == "Great Britain", "United Kingdom", country))
<<<<<<< HEAD
# Transfrom risk item such that high values represent more risk taking
WVS_data$risktaking = 6 - WVS_data$risktaking + 1
# Transform risk variable into T-score (mean = 50, sd = 10)
WVS_data$T_score_risktaking = 10*scale(WVS_data$risktaking, center=TRUE,scale=TRUE)+50
WVS_data
#Transform risk variable into Z score
# Assuming T-scores have a mean of 50 and a standard deviation of 10
WVS_data$Z_score_risktaking = (WVS_data$T_score_risktaking - 50) / 10
# Print the resulting data frame
print(WVS_data)
WVS_data <- WVS_data %>%
group_by(country) %>%
mutate(z_score_age = scale(age))
WVS_data
=======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
=======
>>>>>>> Stashed changes
<<<<<<< Updated upstream
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
<<<<<<< Updated upstream
=======
<<<<<<< HEAD
unique(WVS_data$country)
<<<<<<< HEAD
WVS_mixed_model <- left_join(WVS_data, hardship, by = "country")
WVS_mixed_model
head(WVS_mixed_model)
library(lmerTest)
# intercept only model
model0 = lmer(Z_score_risktaking ~ 1 + (1|country),data = WVS_mixed_model)
summary_model0=summary(model0)
summary_model0
=======
[1] "Andorra" "Argentina" "Australia" "Brazil" "Bulgaria"
[6] "Burkina Faso" "Canada" "Cyprus (G)" "Chile" "China"
[11] "Egypt" "Ethiopia" "Finland" "France" "Georgia"
[16] "Germany" "Ghana" "Hungary" "India" "Indonesia"
[21] "Iran" "Japan" "Malaysia" "Mali" "Mexico"
[26] "Moldova" "Morocco" "Netherlands" "Norway" "Peru"
[31] "Poland" "Romania" "Russia" "Rwanda" "Slovenia"
[36] "South Africa" "South Korea" "Spain" "Sweden" "Switzerland"
[41] "Taiwan" "Thailand" "Trinidad and Tobago" "Turkey" "Ukraine"
[46] "United Kingdom" "Uruguay" "Viet Nam" "Zambia" "Algeria"
[51] "Armenia" "Azerbaijan" "Belarus" "Colombia" "Ecuador"
[56] "Estonia" "Haiti" "Iraq" "Jordan" "Kazakhstan"
[61] "Kuwait" "Kyrgyzstan" "Lebanon" "Libya" "New Zealand"
[66] "Nigeria" "Pakistan" "Palestine" "Philippines" "Qatar"
[71] "Singapore" "Tunisia" "United States" "Uzbekistan" "Yemen"
[76] "Zimbabwe"
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
# age, sex
model1 = lmer(T_score_risktaking ~ 1 +scale(age)+factor(gender) + (1+scale(age)+factor(gender)|country),data = WVS_mixed_model, control = lmerControl(optimizer = "bobyqa"))
summary_model1=summary(model1)
summary_model1
<<<<<<< HEAD
=======
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: T_score_risktaking ~ 1 + scale(age) + factor(gender) + (1 + scale(age) + factor(gender) | country)
Data: WVS_mixed_model
Control: lmerControl(optimizer = "bobyqa")
REML criterion at convergence: 1081364
Scaled residuals:
Min 1Q Median 3Q Max
-2.4737 -0.7821 -0.0770 0.7536 3.2222
Random effects:
Groups Name Variance Std.Dev. Corr
country (Intercept) 6.6199 2.5729
scale(age) 0.7621 0.8730 0.30
factor(gender)1 0.8747 0.9353 0.13 0.27
Residual 84.6046 9.1981
Number of obs: 148527, groups: country, 76
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 51.4031 0.2977 75.2144 172.66 <2e-16 ***
scale(age) -2.0093 0.1042 73.1211 -19.28 <2e-16 ***
factor(gender)1 -2.3174 0.1194 72.3693 -19.41 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) scl(g)
scale(age) 0.291
fctr(gndr)1 0.072 0.236
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
#model 2
library(lme4)
library(lme4)
library(lmerTest)
# Define the lmer model and assign it to 'model_2'
model_2 <- lmer(T_score_risktaking ~ 1 + scale(age) + factor(gender) + factor(children) +
factor(married) + factor(education) + factor(employed) +
(1 + scale(age) + factor(gender) + factor(children) + factor(employed) +
factor(married) | country),
data = WVS_mixed_model, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
# Display the summary of the model
summary_model_2 = summary(model_2)
summary_model_2
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: T_score_risktaking ~ 1 + scale(age) + factor(gender) + factor(children) +
factor(married) + factor(education) + factor(employed) +
(1 + scale(age) + factor(gender) + factor(children) + factor(employed) + factor(married) | country)
Data: WVS_mixed_model
Control: lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+05))
REML criterion at convergence: 1079996
Scaled residuals:
Min 1Q Median 3Q Max
-2.5457 -0.7815 -0.0813 0.7425 3.1678
Random effects:
Groups Name Variance Std.Dev. Corr
country (Intercept) 5.4671 2.3382
scale(age) 0.5367 0.7326 0.24
factor(gender)1 0.9298 0.9642 0.03 0.24
factor(children)1 0.7895 0.8885 0.07 0.19 0.11
factor(employed)1 0.3133 0.5597 0.04 0.03 0.02 -0.27
factor(married)1 0.4120 0.6419 0.22 0.43 0.57 0.20 -0.13
Residual 83.7217 9.1500
Number of obs: 148527, groups: country, 76
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 5.204e+01 2.809e-01 8.000e+01 185.238 < 2e-16 ***
scale(age) -1.478e+00 9.081e-02 7.228e+01 -16.275 < 2e-16 ***
factor(gender)1 -2.171e+00 1.234e-01 7.259e+01 -17.597 < 2e-16 ***
factor(children)1 -1.274e+00 1.284e-01 7.199e+01 -9.920 4.14e-15 ***
factor(married)1 -8.367e-01 9.872e-02 6.267e+01 -8.475 5.49e-12 ***
factor(education)1 7.809e-01 6.489e-02 1.407e+05 12.033 < 2e-16 ***
factor(employed)1 1.056e-01 8.590e-02 7.071e+01 1.229 0.223
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) scl(g) fctr(g)1 fctr(c)1 fctr(mr)1 fctr(d)1
scale(age) 0.224
fctr(gndr)1 -0.022 0.212
fctr(chld)1 -0.016 0.047 0.032
fctr(mrrd)1 0.134 0.297 0.409 -0.083
fctr(dctn)1 -0.172 0.081 0.013 0.026 -0.013
fctr(mply)1 -0.029 0.061 0.083 -0.203 -0.099 -0.063
WVS_mixed_model
NA
NA
# age, sex
model1 = lmer(T_score_risktaking ~ 1 +scale(age)+factor(gender) + (1+scale(age)+factor(gender)|country),data = WVS_mixed_model, control = lmerControl(optimizer = "bobyqa"))
summary_model1=summary(model1)
summary_model1
=======
>>>>>>> Stashed changes
<<<<<<< Updated upstream
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
<<<<<<< Updated upstream
=======
<<<<<<< HEAD
<<<<<<< HEAD
model_3 <- lmer(T_score_risktaking ~ 1 + scale(z_score_age) * hardship_index +
factor(gender) * hardship_index + factor(married) + factor(children) +
factor(education) + factor(employed) +
(1 + scale(z_score_age) + factor(married) + factor(children) +
factor(education) + factor(employed) | country),
data = WVS_mixed_model)
summary(model_3)
=======
model_3 <- lmer(T_score_risktaking ~ 1 + scale(age) * hardship_index +
factor(gender) * hardship_index + factor(married) + factor(children) +
factor(education) + factor(employed) +
(1 + scale(age) + factor(married) + factor(children) +
factor(education) + factor(employed) | country),
data = WVS_mixed_model,control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
summary_model_3 = summary(model_3)
summary_model_3
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: T_score_risktaking ~ 1 + scale(age) * hardship_index + factor(gender) *
hardship_index + factor(married) + factor(children) + factor(education) +
factor(employed) + (1 + scale(age) + factor(married) + factor(children) + factor(education) + factor(employed) | country)
Data: WVS_mixed_model
Control: lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+05))
REML criterion at convergence: 1080093
Scaled residuals:
Min 1Q Median 3Q Max
-2.57571 -0.78110 -0.08036 0.74750 3.13409
Random effects:
Groups Name Variance Std.Dev. Corr
country (Intercept) 5.5510 2.3561
scale(age) 0.3952 0.6286 0.17
factor(married)1 0.4028 0.6347 0.13 0.13
factor(children)1 0.8063 0.8980 0.09 0.06 0.25
factor(education)1 0.6332 0.7957 -0.20 0.03 0.07 -0.13
factor(employed)1 0.2881 0.5368 0.00 0.08 -0.29 -0.25 0.16
Residual 83.8078 9.1547
Number of obs: 148527, groups: country, 76
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 5.204e+01 2.862e-01 7.433e+01 181.838 < 2e-16 ***
scale(age) -1.442e+00 8.035e-02 7.109e+01 -17.949 < 2e-16 ***
hardship_index 4.588e-01 3.840e-01 7.514e+01 1.195 0.236
factor(gender)1 -2.081e+00 5.032e-02 1.285e+05 -41.359 < 2e-16 ***
factor(married)1 -8.145e-01 9.857e-02 6.114e+01 -8.263 1.53e-11 ***
factor(children)1 -1.302e+00 1.292e-01 7.512e+01 -10.070 1.39e-15 ***
factor(education)1 7.768e-01 1.205e-01 5.044e+01 6.447 4.24e-08 ***
factor(employed)1 1.031e-01 8.357e-02 6.975e+01 1.233 0.222
scale(age):hardship_index 4.751e-01 1.122e-01 7.216e+01 4.233 6.68e-05 ***
hardship_index:factor(gender)1 5.799e-01 6.902e-02 6.340e+04 8.403 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) scl(g) hrdsh_ fctr(g)1 fctr(mr)1 fctr(c)1 fctr(d)1 fctr(mp)1 sc():_
scale(age) 0.158
hardshp_ndx 0.067 0.034
fctr(gndr)1 -0.098 0.042 0.002
fctr(mrrd)1 0.066 0.078 -0.005 0.044
fctr(chld)1 0.005 -0.062 -0.003 -0.087 -0.054
fctr(dctn)1 -0.285 0.080 0.014 0.016 0.030 -0.069
fctr(mply)1 -0.056 0.095 0.006 0.145 -0.190 -0.186 0.046
scl(g):hrd_ 0.032 0.091 0.191 0.002 -0.005 0.005 -0.002 -0.035
hrdshp_:()1 -0.002 0.011 -0.092 0.057 -0.012 -0.006 0.006 0.030 0.023
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
<<<<<<< Updated upstream
=======
<<<<<<< HEAD
<<<<<<< HEAD
anova(model0,model1)
anova(model1,model_2)
anova(model_2,model_3)
=======
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
<<<<<<< Updated upstream
=======
<<<<<<< HEAD
random_effects <- ranef(model_2)
random_effects
$country
(Intercept) scale(age) factor(gender)1 factor(children)1 factor(employed)1 factor(married)1
Algeria 1.93351855 -0.854619155 0.87619718 -2.437881334 0.17698875 -0.377226443
Andorra 1.91309921 0.100909057 -0.66981587 -0.632350380 0.20524734 -0.686912835
Argentina -1.57325789 0.057299092 -0.25780065 -1.067941885 -0.04621841 -0.553872390
Armenia 1.08284389 -0.454274344 -0.89771357 -0.834967062 0.17426467 -0.250770715
Australia -0.14386428 -0.471375287 -1.06538548 -0.103260090 0.34608388 -0.365152174
Azerbaijan 0.45573171 0.004004243 -2.44218293 0.082693851 -0.21915868 -0.476480146
Belarus -0.11536490 -1.000016058 -1.08120720 -0.467055853 -0.59713729 -0.046875401
Brazil -2.84287325 0.262612027 -0.36729059 -0.148830175 -0.34944728 -0.655399532
Bulgaria -0.77688584 -0.074197571 0.35410308 0.108171529 0.66545761 -0.168532781
Burkina Faso 1.61422833 1.156372503 -0.15049497 0.527033659 -0.25535458 0.423175478
Canada 0.39907784 -0.397232782 -1.02665629 -0.204786757 0.83298979 -0.733722779
Chile 1.03350248 -0.644167015 0.06242265 -1.191152814 0.30273676 0.182724595
China -2.09375223 -0.445731013 0.50663419 -0.603547862 -0.41625835 -0.223192477
Colombia 0.22689773 0.422663335 -0.91548157 -0.850065668 0.05700229 -0.046926087
Cyprus (G) 2.25496876 -0.776460854 -0.79745197 0.050374871 0.20526698 -0.994122261
Ecuador 2.25294069 -0.040563584 0.75768462 1.082273600 -0.18216772 0.606966414
Egypt -3.93763995 0.877857068 1.47333952 -0.977664255 0.69617277 0.506927589
Estonia -1.06399862 -0.805260418 -0.20652339 -0.596528530 0.04115956 -0.263441563
Ethiopia 0.32293567 0.946455342 1.98005066 -0.482906872 1.19465275 0.520837889
Finland -2.30711075 -0.193362752 0.06835226 0.109995921 -0.09624712 -0.446129133
France -0.03262671 -0.315869185 -0.97254579 -0.756893462 -0.18841330 -0.721010031
Georgia -0.34804857 0.313082762 -1.59932353 0.785006390 0.24885966 -0.322662614
Germany -2.81688356 -0.866667483 -0.56600732 -0.067064088 0.10227997 -0.540483663
Ghana 4.20166977 0.817382387 1.03493510 1.320604468 0.06952553 0.935149120
Haiti -6.53977492 -1.391127796 1.91289649 1.468940014 -0.89280260 0.533482158
Hungary -1.99653091 -0.996752173 -0.17049773 -0.160714296 0.07124129 -0.186539589
India 1.43482568 0.617405603 0.45019893 1.836342889 -1.09159157 0.408036403
Indonesia 2.91129285 0.717729512 -0.37251725 0.036310599 0.61487372 0.351255947
Iran 0.25704414 -0.273465758 0.84529203 -0.730085449 0.58356967 -0.185573571
Iraq -1.06492016 0.012316662 0.43906584 0.138047194 -0.32549734 0.649008088
Japan -6.33127212 0.980885912 -0.11206958 0.564989629 -0.44804909 -0.169376931
Jordan 1.80284181 -0.238660302 -0.04733756 -0.275114119 0.13106070 0.079727138
Kazakhstan -2.61497176 0.099878889 0.38099799 -0.441649153 0.38909549 0.080016173
Kuwait 2.09145419 -1.486900320 0.10785659 0.216244412 -0.71982856 -0.372559647
Kyrgyzstan 0.61067751 1.072544199 1.07198178 0.701056752 -0.33081703 0.900953951
Lebanon 2.84470796 -0.023345343 0.08714121 0.523974067 -0.06162559 0.535210026
Libya 0.80327073 -0.475177836 -0.57060729 0.015373078 0.24676530 -0.259391475
Malaysia -2.02257329 0.667498135 0.69083376 0.230243197 -0.12134511 0.648213460
Mali 2.81563100 1.078784421 1.36765639 0.245910074 -0.30999444 1.287801120
Mexico -0.40013922 0.561817933 -0.55226850 -1.131405064 0.01974498 -0.487453888
Moldova -1.96423291 -0.329843137 1.07398956 -0.873396236 0.07687739 0.075323668
Morocco 0.68539027 0.249483178 -0.44534432 -0.309370915 0.01082943 -0.178509821
Netherlands -2.06588418 -0.228085056 -0.89179246 0.412747451 -0.17127304 -0.633635212
New Zealand 0.60732681 -0.774713993 0.04302897 -0.175577939 -0.11512608 -0.279411963
Nigeria 5.59377567 1.275958637 1.62013094 0.389674844 0.37813269 1.361593143
Norway 0.99797819 -0.771979285 0.88446601 -0.045167601 -0.33921268 -0.013483356
Pakistan 4.22659980 1.325790041 0.51442825 0.928501617 -0.97792666 0.666654501
Palestine 0.03194219 -0.494835906 -0.14515969 0.292953341 0.50604479 -0.015691232
Peru -1.61516779 0.633332407 -0.68009631 -0.717362556 -0.39962778 -0.181622730
Philippines 3.70377389 0.943369150 1.13088110 0.747509770 -0.08964864 0.356984425
Poland 2.19905667 0.037084593 -0.45404816 -0.900087529 0.25558657 0.232224025
Qatar 0.86028228 0.502376889 -0.94153784 0.200394431 0.45200189 -0.086160547
Romania -2.52089552 -0.155453441 -0.24318156 -0.213424238 0.59038608 -0.046222935
Russia -0.03564662 0.201433455 -0.04277014 0.338525048 0.55241645 -0.367819701
Rwanda 0.83617515 1.171444046 1.19476510 1.697279263 -0.29018529 0.335814980
Singapore 2.17597132 0.591444549 0.38684581 -0.017294940 -0.08165496 0.363947899
Slovenia 0.21102243 -1.245719908 -0.62662173 -0.617380784 0.28218849 -1.002740221
South Africa 2.37631040 0.311956458 1.26337006 1.080146122 0.68094981 0.751652547
South Korea 1.36893323 -0.405664050 0.80080531 0.341944092 -0.04931702 0.322300385
Spain 0.82809176 -0.466229484 0.62854866 -0.304041861 0.09422269 -0.358645793
Sweden 0.09920433 -0.328664254 -0.47169418 -0.328195601 -0.42679317 -0.438405460
Switzerland -1.56290696 0.084346338 -1.48036381 0.605515233 0.14178415 -0.884764664
Taiwan -4.35319381 -0.569177868 -0.09471962 -0.003120567 -0.38488863 -0.220827542
Thailand -0.09358157 0.844688730 1.30128241 0.253396867 -0.53318528 1.057267847
Trinidad and Tobago 0.24160167 -0.343056024 -0.36770149 1.121472297 0.13881740 0.059010394
Tunisia -0.42814434 -1.362242692 -0.53278180 -0.600878765 -0.28277064 -0.244015679
Turkey 0.94251912 0.120341608 0.37598170 -0.387346063 0.29373891 0.028586139
Ukraine -1.58175919 -0.668879956 -0.36649799 -0.519892277 0.26972976 -0.001257245
United Kingdom 1.15668394 -0.030727372 -1.56593196 -0.489635482 0.10560093 -0.751106765
United States -0.70200525 -0.752298720 -0.40433841 0.416924321 0.25359660 -0.253434481
Uruguay -3.20629770 -0.108243534 0.34971574 -0.439094936 -0.31919572 -0.167863204
Uzbekistan 1.00109484 0.687012035 -0.28533330 0.716274322 0.20755393 0.141926144
Viet Nam -3.44301278 0.598580704 -0.35309866 0.622440999 -0.56204886 0.334138408
Yemen -3.91719513 0.062896576 -0.10339324 -0.646218561 -0.08885691 -0.219935374
Zambia 1.41695079 0.455513249 0.41766478 1.043367849 -0.57988565 1.261564524
Zimbabwe 1.68856739 0.396489975 -1.11595904 0.496697944 -0.32194635 -0.119112532
with conditional variances for “country”
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
# Extract random effects for 'country'
# Assuming 'model' is your fitted lmer model
random_effects <- ranef(model_2)
random_effects
<<<<<<< Updated upstream
=======
<<<<<<< HEAD
colnames(random_effects)
NULL
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
=======
>>>>>>> Stashed changes
regression_results_WVS <- WVS_data %>%
group_by(country) %>%
do(model = lm(Z_score_risktaking ~ scale(age) + gender, data = .)) %>%
summarize(
country = first(country),
intercept_regression = coef(summary(model))[1, 1],
slope_age_regression = coef(summary(model))[2, 1],
slope_gender_regression = coef(summary(model))[3, 1]
)
regression_results_WVS
random_effects <- ranef(model_2)
random_effects
colnames(random_effects)
<<<<<<< Updated upstream
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
coefsallmodels=rbind(summary_model1$coefficients,
summary_model_2$coefficients,
summary_model_3$coefficients[c(1:2,4:8,3,9:10),])
write.csv(coefsallmodels,"coefsallmodels.csv")
# Read the CSV file into a data frame
gbd_mentalhealth <- read_excel("/Users/cristinacandido/Documents/Github/risk_wvs/GBD_mentalhealth.xlsx")
gbd_mentalhealth
#select only the variables of interest
gbd_mentalhealth <- gbd_mentalhealth %>%
dplyr::select(country, gender, age, cause, val, Measure)
gbd_mentalhealth
library(dplyr)
# Group data by country and age group, and calculate summary statistics
summary_by_country_age <- gbd_mentalhealth %>%
group_by(country, age) %>%
summarise(
mean_DALYs = mean(val)) # Calculate mean of DALYs
library(dplyr)
# Assuming 'summary_by_country_age' contains your summarized dataset
mean_by_country <- summary_by_country_age %>%
group_by(country) %>%
summarise(mean_DALYs = mean(mean_DALYs))
# View the resulting mean by country
print(mean_by_country)
#log transform
mean_by_country$mean_DALYs=log(mean_by_country$mean_DALYs)
mean_by_country
#Reverse codierung
mean_by_country$mean_DALYs=scale(mean_by_country$mean_DALYs)
mean_by_country
#rename mean_DALYS
mental_health_index <- mean_by_country %>%
rename('mental_health' = mean_DALYs)
mental_health_index
library(dplyr)
#######Anxiety disorders#########
#Filter data for a specific mental disorder (e.g., Anxiety Disorders)
anxiety_disorders <- gbd_mentalhealth %>%
filter(cause == "Anxiety disorders") # Change "Anxiety Disorders" to the desired disorder
# Calculate the mean of 'val' (Disability-Adjusted Life Years) across locations and ages
mean_DALYs <- mean(anxiety_disorders$val)
# Optionally, if you want to calculate mean by country:
anxiety_disorders <- anxiety_disorders %>%
group_by(country) %>%
summarise(mean_Anxiety_disorders = mean(val))
anxiety_disorders
#log transform
anxiety_disorders$mean_Anxiety_disorders=log(anxiety_disorders$mean_Anxiety_disorders)
anxiety_disorders
#Reverse codierung
anxiety_disorders$mean_Anxiety_disorders=scale(anxiety_disorders$mean_Anxiety_disorders)
anxiety_disorders
mental_health_index
gbd_mentalhealth
# Assuming gbd_mentalhealth is your data frame containing the 'cause' column
# Get unique values of 'cause' column
unique_causes <- unique(gbd_mentalhealth$cause)
# Create a data frame with unique causes
cause_table <- data.frame(Cause = unique_causes)
# Print the cause table
print(cause_table)
#######Bulimia nervosa########
library(dplyr)
# Filter the data for 'Bulimia Nervosa'
bulimia_nervosa <- gbd_mentalhealth %>%
filter(cause == "Bulimia nervosa")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(bulimia_nervosa$val)
# Optionally, calculate mean by country
bulimia_nervosa <- bulimia_nervosa %>%
group_by(country) %>%
summarise(mean_bulimia_nervosa = mean(val))
# Log transform the mean_bulimia_nervosa column
bulimia_nervosa$mean_bulimia_nervosa <- log(bulimia_nervosa$mean_bulimia_nervosa)
# Scale the mean_bulimia_nervosa column (if needed)
bulimia_nervosa$mean_bulimia_nervosa <- scale(bulimia_nervosa$mean_bulimia_nervosa)
# Print the resulting data frame
print(bulimia_nervosa)
print(anxiety_disorders)
gbd_mentalhealth
#####Attention-deficit/hyperactivity disorder
library(dplyr)
ADHD <- gbd_mentalhealth %>%
filter(cause == "Attention-deficit/hyperactivity disorder")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(ADHD$val)
# Optionally, calculate mean by country
ADHD <- ADHD %>%
group_by(country) %>%
summarise(mean_ADHD = mean(val))
# Log transform the mean_bulimia_nervosa column
ADHD$mean_ADHD <- log(ADHD$mean_ADHD)
# Scale the mean_bulimia_nervosa column (if needed)
ADHD$mean_ADHD <- scale(ADHD$mean_ADHD)
# Print the resulting data frame
print(ADHD)
#########Idiopathic development intellectual ability
library(dplyr)
Idiopathic_developmental_intellectual_disability <- gbd_mentalhealth %>%
filter(cause == "Idiopathic developmental intellectual disability")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(Idiopathic_developmental_intellectual_disability$val)
# Optionally, calculate mean by country
Idiopathic_developmental_intellectual_disability <- Idiopathic_developmental_intellectual_disability %>%
group_by(country) %>%
summarise(mean_Idiopathic_developmental_intellectual_disability = mean(val))
# Log transform the mean_bulimia_nervosa column
Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability <- log(Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability)
# Scale the mean_bulimia_nervosa column (if needed)
Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability <- scale(Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability)
# Print the resulting data frame
print(Idiopathic_developmental_intellectual_disability)
######Anorexia Nervosa
anorexia_nervosa <- gbd_mentalhealth %>%
filter(cause == "Anorexia nervosa")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(anorexia_nervosa$val)
# Optionally, calculate mean by country
anorexia_nervosa <- anorexia_nervosa %>%
group_by(country) %>%
summarise(mean_anorexia_nervosa = mean(val))
# Log transform the mean_bulimia_nervosa column
anorexia_nervosa$mean_anorexia_nervosa <- log(anorexia_nervosa$mean_anorexia_nervosa)
# Scale the mean_bulimia_nervosa column (if needed)
anorexia_nervosa$mean_anorexia_nervosa <- scale(anorexia_nervosa$mean_anorexia_nervosa)
# Print the resulting data frame
print(anorexia_nervosa)
#####Depressive disorders#######
depressive_disorders <- gbd_mentalhealth %>%
filter(cause == "Depressive disorders")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(depressive_disorders$val)
# Optionally, calculate mean by country
depressive_disorders <- depressive_disorders %>%
group_by(country) %>%
summarise(mean_depressive_disorders = mean(val))
# Log transform the mean_bulimia_nervosa column
depressive_disorders$mean_depressive_disorders <- log(depressive_disorders$mean_depressive_disorders)
# Scale the mean_bulimia_nervosa column (if needed)
depressive_disorders$mean_depressive_disorders <- scale(depressive_disorders$mean_depressive_disorders)
# Print the resulting data frame
print(depressive_disorders)
#######Autismus spectrum disorders######
autismus_spectrum_disorders <- gbd_mentalhealth %>%
filter(cause == "Autism spectrum disorders")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(autismus_spectrum_disorders$val)
# Optionally, calculate mean by country
autismus_spectrum_disorders <- autismus_spectrum_disorders %>%
group_by(country) %>%
summarise(mean_autismus_spectrum_disorders = mean(val))
# Log transform the mean_bulimia_nervosa column
autismus_spectrum_disorders$mean_autismus_spectrum_disorders <- log(autismus_spectrum_disorders$mean_autismus_spectrum_disorders)
# Scale the mean_bulimia_nervosa column (if needed)
autismus_spectrum_disorders$mean_autismus_spectrum_disorders <- scale(autismus_spectrum_disorders$mean_autismus_spectrum_disorders)
# Print the resulting data frame
print(autismus_spectrum_disorders)
######Schizophrenia#######
schizophrenia <- gbd_mentalhealth %>%
filter(cause == "Schizophrenia")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(schizophrenia$val)
# Optionally, calculate mean by country
schizophrenia <- schizophrenia %>%
group_by(country) %>%
summarise(mean_schizophrenia = mean(val))
# Log transform the mean_bulimia_nervosa column
schizophrenia$mean_schizophrenia <- log(schizophrenia$mean_schizophrenia)
# Scale the mean_bulimia_nervosa column (if needed)
schizophrenia$mean_schizophrenia <- scale(schizophrenia$mean_schizophrenia)
# Print the resulting data frame
print(schizophrenia)
#######Conduct disorders#########
conduct_disorders <- gbd_mentalhealth %>%
filter(cause == "Conduct disorder")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(conduct_disorders$val)
# Optionally, calculate mean by country
conduct_disorders <- conduct_disorders %>%
group_by(country) %>%
summarise(mean_conduct_disorders = mean(val))
# Log transform the mean_bulimia_nervosa column
conduct_disorders$mean_conduct_disorders <- log(conduct_disorders$mean_conduct_disorders)
# Scale the mean_bulimia_nervosa column (if needed)
conduct_disorders$mean_conduct_disorders <- scale(conduct_disorders$mean_conduct_disorders)
# Print the resulting data frame
print(conduct_disorders)
########Eating disorders#########
eating_disorders <- gbd_mentalhealth %>%
filter(cause == "Eating disorders")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(eating_disorders$val)
# Optionally, calculate mean by country
eating_disorders <- eating_disorders %>%
group_by(country) %>%
summarise(mean_eating_disorders = mean(val))
# Log transform the mean_bulimia_nervosa column
eating_disorders$mean_eating_disorders <- log(eating_disorders$mean_eating_disorders)
# Scale the mean_bulimia_nervosa column (if needed)
eating_disorders$mean_eating_disorders <- scale(eating_disorders$mean_eating_disorders)
# Print the resulting data frame
print(eating_disorders)
########Bipolar disorder#########
bipolar_disorder <- gbd_mentalhealth %>%
filter(cause == "Bipolar disorder")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(bipolar_disorder$val)
# Optionally, calculate mean by country
bipolar_disorder <- bipolar_disorder %>%
group_by(country) %>%
summarise(mean_bipolar_disorder = mean(val))
# Log transform the mean_bulimia_nervosa column
bipolar_disorder$mean_bipolar_disorder <- log(bipolar_disorder$mean_bipolar_disorder)
# Scale the mean_bulimia_nervosa column (if needed)
bipolar_disorder$mean_bipolar_disorder <- scale(bipolar_disorder$mean_bipolar_disorder)
# Print the resulting data frame
print(bipolar_disorder)
print(cause_table)
########Substance use disorders########
substance_use_disorders <- gbd_mentalhealth %>%
filter(cause == "Substance use disorders")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(substance_use_disorders$val)
# Optionally, calculate mean by country
substance_use_disorders <- substance_use_disorders %>%
group_by(country) %>%
summarise(mean_substance_use_disorders = mean(val))
# Log transform the mean_bulimia_nervosa column
substance_use_disorders$mean_substance_use_disorders <- log(substance_use_disorders$mean_substance_use_disorders)
# Scale the mean_bulimia_nervosa column (if needed)
substance_use_disorders$mean_substance_use_disorders <- scale(substance_use_disorders$mean_substance_use_disorders)
# Print the resulting data frame
print(substance_use_disorders)
####Drug use disorders
drug_use_disorders <- gbd_mentalhealth %>%
filter(cause == "Drug use disorders")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(drug_use_disorders$val)
# Optionally, calculate mean by country
drug_use_disorders <- drug_use_disorders %>%
group_by(country) %>%
summarise(mean_drug_use_disorders = mean(val))
# Log transform the mean_bulimia_nervosa column
drug_use_disorders$mean_drug_use_disorders <- log(drug_use_disorders$mean_drug_use_disorders)
# Scale the mean_bulimia_nervosa column (if needed)
drug_use_disorders$mean_drug_use_disorders <- scale(drug_use_disorders$mean_drug_use_disorders)
# Print the resulting data frame
print(drug_use_disorders)
##########Alcohol use disorders
alcohol_use_disorders <- gbd_mentalhealth %>%
filter(cause == "Alcohol use disorders")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(alcohol_use_disorders$val)
# Optionally, calculate mean by country
alcohol_use_disorders <- alcohol_use_disorders %>%
group_by(country) %>%
summarise(mean_alcohol_use_disorders = mean(val))
# Log transform the mean_bulimia_nervosa column
alcohol_use_disorders$mean_alcohol_use_disorders <- log(alcohol_use_disorders$mean_alcohol_use_disorders)
# Scale the mean_bulimia_nervosa column (if needed)
alcohol_use_disorders$mean_alcohol_use_disorders <- scale(alcohol_use_disorders$mean_alcohol_use_disorders)
# Print the resulting data frame
print(alcohol_use_disorders)
#######Major depressive disorders
major_depressive_disorder <- gbd_mentalhealth %>%
filter(cause == "Major depressive disorder")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(major_depressive_disorder$val)
# Optionally, calculate mean by country
major_depressive_disorder <- major_depressive_disorder %>%
group_by(country) %>%
summarise(mean_major_depressive_disorder = mean(val))
# Log transform the mean_bulimia_nervosa column
major_depressive_disorder$mean_major_depressive_disorder <- log(major_depressive_disorder$mean_major_depressive_disorder)
# Scale the mean_bulimia_nervosa column (if needed)
major_depressive_disorder$mean_major_depressive_disorder <- scale(major_depressive_disorder$mean_major_depressive_disorder)
# Print the resulting data frame
print(major_depressive_disorder)
#######Dysthymia########
dysthymia <- gbd_mentalhealth %>%
filter(cause == "Dysthymia")
# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(dysthymia$val)
# Optionally, calculate mean by country
dysthymia <- dysthymia %>%
group_by(country) %>%
summarise(mean_dysthymia = mean(val))
# Log transform the mean_bulimia_nervosa column
dysthymia$mean_dysthymia <- log(dysthymia$mean_dysthymia)
# Scale the mean_bulimia_nervosa column (if needed)
dysthymia$mean_dysthymia <- scale(dysthymia$mean_dysthymia)
# Print the resulting data frame
print(dysthymia)
library(dplyr)
# Perform left joins for each data frame on 'country'
final_mental_health_index <- mental_health_index %>%
left_join(bulimia_nervosa, by = "country") %>%
left_join(ADHD, by = "country") %>%
left_join(Idiopathic_developmental_intellectual_disability, by = "country") %>%
left_join(anorexia_nervosa, by = "country") %>%
left_join(depressive_disorders, by = "country") %>%
left_join(autismus_spectrum_disorders, by = "country") %>%
left_join(conduct_disorders, by = "country") %>%
left_join(schizophrenia, by = "country") %>%
left_join(eating_disorders, by = "country") %>%
left_join(bipolar_disorder, by = "country") %>%
left_join(drug_use_disorders, by = "country") %>%
left_join(alcohol_use_disorders, by = "country") %>%
left_join(substance_use_disorders, by = "country") %>%
left_join(major_depressive_disorder, by = "country") %>%
left_join(dysthymia, by = "country")
# Display the resulting data frame
print(final_mental_health_index)
# Show the first few rows of the resulting data frame
head(final_mental_health_index)
indicators <- left_join(final_mental_health_index, hardship, by = "country")
indicators
head(indicators)
new_data <- left_join (WVS_data, indicators, by = "country")
new_data
# Transfrom risk item such that high values represent more risk taking
new_data$risktaking = 6 - new_data$risktaking + 1
# Transform risk variable into T-score (mean = 50, sd = 10)
new_data$T_score_risktaking = 10*scale(new_data$risktaking, center=TRUE,scale=TRUE)+50
new_data
#Transform risk variable into Z score
# Assuming T-scores have a mean of 50 and a standard deviation of 10
new_data$Z_score_risktaking = (new_data$T_score_risktaking - 50) / 10
# Print the resulting data frame
print(new_data)
new_data <- new_data %>%
group_by(country) %>%
mutate(z_score_age = scale(age))
new_data
<<<<<<< Updated upstream
=======
<<<<<<< HEAD
<<<<<<< HEAD
=======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
library(lme4)
library(lme4)
model <- lmer(T_score_risktaking ~ scale(z_score_age) * mental_health +
gender * mental_health +
factor(married) + factor(children) +
factor(education) + factor(employed) +
(1 + scale(z_score_age) + factor(married) + factor(children) +
factor(education) + factor(employed) | country),
<<<<<<< Updated upstream
data = new_data, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
=======
<<<<<<< HEAD
<<<<<<< HEAD
data = new_data)
=======
data = new_data, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
=======
data = new_data, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
summary(model)
# Assuming 'model' is a linear mixed-effects model (lmer), and you want to save coefficients to a CSV file
# Extract coefficients from the model summary
coefficients_df <- data.frame(summary(model)$coefficients)
# Write coefficients to a CSV file
write.csv(coefficients_df, "model_coefficients.csv", row.names = TRUE)
<<<<<<< Updated upstream
=======
<<<<<<< HEAD
<<<<<<< HEAD
=======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
=======
>>>>>>> 102b2708b98624b69d3d62a25724b361d57d7648
>>>>>>> Stashed changes
```
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkobWFwcykKbGlicmFyeShoYXZlbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCmhhcmRzaGlwX2NvbXBsZXRlIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9jb2RlL0hhcmRzaGlwX2NvbXBsZXRlXzIwMjQueGxzeCIpCmhhcmRzaGlwX2NvbXBsZXRlCgoKCgpgYGAKYGBge3J9CmhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZT1sb2coaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlKQpoYXJkc2hpcF9jb21wbGV0ZSRnZHA9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJGdkcCkKaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHkpCmhhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeSkKCmhhcmRzaGlwX2NvbXBsZXRlCgojIFJldmVyc2UgQ29kaWVydW5nCmhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZT1zY2FsZShoYXJkc2hpcF9jb21wbGV0ZSRob21pY2lkZXJhdGUpCmhhcmRzaGlwX2NvbXBsZXRlJGdkcD1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkZ2RwKQpoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHk9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5KQpoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeT1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkbGlmZWV4cGVjdGFuY3kpCmhhcmRzaGlwX2NvbXBsZXRlJGdpbmk9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkZ2luaSkKaGFyZHNoaXBfY29tcGxldGUkZmVtYWxlbWFsZV9wcmltZWR1PXNjYWxlKC1oYXJkc2hpcF9jb21wbGV0ZSRmZW1hbGVtYWxlX3ByaW1lZHUpCmhhcmRzaGlwX2NvbXBsZXRlCgpoYXJkc2hpcF9jb21wbGV0ZSRoYXJkc2hpcF9pbmRleD0oaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlK2hhcmRzaGlwX2NvbXBsZXRlJGdkcCtoYXJkc2hpcF9jb21wbGV0ZSRnaW5pK2hhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5K2hhcmRzaGlwX2NvbXBsZXRlJGluZmFudG1vcnRhbGl0eStoYXJkc2hpcF9jb21wbGV0ZSRmZW1hbGVtYWxlX3ByaW1lZHUpLzYKCmhhcmRzaGlwX2NvbXBsZXRlCgojIExhdXJhIGFkZGVkIHRoaXMgY29kZQpsaWJyYXJ5KGRwbHlyKQoKIyBJbXB1dGUgbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGhhcmRzaGlwIGluZGljYXRvcnMgdXNpbmcgdGhlIG1lZGlhbgpoYXJkc2hpcF9jb21wbGV0ZSA8LSBoYXJkc2hpcF9jb21wbGV0ZSAlPiUKICBtdXRhdGUoYWNyb3NzKGMoImhvbWljaWRlcmF0ZSIsICJnZHAiLCAiaW5mYW50bW9ydGFsaXR5IiwgImxpZmVleHBlY3RhbmN5IiwgImdpbmkiLCAiZmVtYWxlbWFsZV9wcmltZWR1IiksCiAgICAgICAgICAgICAgICB+aWZlbHNlKGlzLm5hKC4pLCBtZWRpYW4oLiwgbmEucm0gPSBUUlVFKSwgLikpKQoKaGFyZHNoaXBfY29tcGxldGUKCiMgVXNlIHRoZSBtdXRhdGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjb3VudHJ5IG5hbWUKaGFyZHNoaXBfY29tcGxldGUgPC0gaGFyZHNoaXBfY29tcGxldGUgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UobGFiZWwgPT0gIlNlcmJpYSBhbmQgTW9udGVuZWdybyIsICJTZXJiaWEiLCBsYWJlbCkpCmhhcmRzaGlwX2NvbXBsZXRlCmBgYApgYGB7cn0KIyBDaGVja2luZyBMb2cgVHJhbnNmb3JtYXRpb24gYW5kIFNjYWxpbmcvUmV2ZXJzaW5nOgoKc3VtbWFyeShoYXJkc2hpcF9jb21wbGV0ZVssIGMoImhvbWljaWRlcmF0ZSIsICJnZHAiLCAiaW5mYW50bW9ydGFsaXR5IiwgImxpZmVleHBlY3RhbmN5IildKQojIFZpc3VhbGl6ZSBkaXN0cmlidXRpb25zIGJlZm9yZSBhbmQgYWZ0ZXIgdHJhbnNmb3JtYXRpb24KZ2dwbG90KGhhcmRzaGlwX2NvbXBsZXRlLCBhZXMoeCA9IGdkcCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBHRFAgQmVmb3JlIFRyYW5zZm9ybWF0aW9uIikgKwogIHhsYWIoIkdEUCIpICsgeWxhYigiRnJlcXVlbmN5IikKCmdncGxvdChoYXJkc2hpcF9jb21wbGV0ZSwgYWVzKHggPSBzY2FsZSgtZ2RwKSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBHRFAgQWZ0ZXIgU2NhbGluZy9SZXZlcnNpbmciKSArCiAgeGxhYigiU2NhbGVkL1JldmVyc2VkIEdEUCIpICsgeWxhYigiRnJlcXVlbmN5IikKYGBgCgojIENoZWNraW5nIEVmZmVjdGl2ZW5lc3Mgb2YgSW1wdXRhdGlvbiBNZXRob2QKYGBge3J9CnN1bW1hcnkoaGFyZHNoaXBfY29tcGxldGVbLCBjKCJob21pY2lkZXJhdGUiLCAiZ2RwIiwgImluZmFudG1vcnRhbGl0eSIsICJsaWZlZXhwZWN0YW5jeSIsICJnaW5pIiwgImZlbWFsZW1hbGVfcHJpbWVkdSIpXSkKYGBgCgoKCmBgYHtyfQojIERhdGEgb2YgV2F2ZSA1CgoKV1Y1X2RhdGEgPC0gcmVhZFJEUygiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL0YwMDAwNzk0NC1XVjVfRGF0YV9SX3YyMDE4MDkxMi5yZHMiKQoKCiMgQ29udmVydCBXVjVfZGF0YS1vYmplY3QgaW4gZGF0YS5mcmFtZSAKV1Y1X2RhdGFfZGYgPC0gYXMuZGF0YS5mcmFtZShXVjVfZGF0YSkKCiMgc2hvdyBmaXJzdCBmaXZlIGNvbHVtbnMKV1Y1X2RhdGFfZGYKYGBgCgoKCmBgYHtyfQojcmVuYW1lIHRoZSB2YXJpYWJsZXMKV1Y1X2RhdGEgPC0gV1Y1X2RhdGFfZGYgJT4lCiAgcmVuYW1lKGdlbmRlciA9IFYyMzUsIGFnZSA9IFYyMzcsIGNvdW50cnlfY29kZSA9IFYyLCB3YXZlID0gVjEsIHJpc2t0YWtpbmcgPSBWODYsIGNoaWxkcmVuID0gVjU2LCBtYXJyaWVkID0gVjU1LCBlbXBsb3llZCA9IFYyNDEsIGVkdWNhdGlvbiA9IFYyMzgpCldWNV9kYXRhCgpjb2xuYW1lcyhXVjVfZGF0YSkKCgoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKV1Y1X2RhdGEgPC0gV1Y1X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLCB3YXZlLCByaXNrdGFraW5nLCBjaGlsZHJlbiwgbWFycmllZCwgZW1wbG95ZWQsIGVkdWNhdGlvbikKV1Y1X2RhdGEKCgojIFJlYWQgY291bnRyeW5hbWVzIGRhdGEgZnJvbSB0aGUgQ1NWIGZpbGUgKHRvIGRlY29kZSB0aGUgZGF0YXNldCA1KQpjb3VudHJ5bmFtZXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9jb3VudHJ5bmFtZXMudHh0IiwgaGVhZGVyID0gRkFMU0UsIGFzLmlzID0gVFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA8LSBjKCJjb2RlIiwgIm5hbWUiKQoKCiMgQXNzdW1pbmcgV1Y1X2RhdGEgaGFzIGEgY29sdW1uIG5hbWVkIGNvdW50cnlfY29kZQpXVjVfZGF0YSRjb3VudHJ5IDwtIGNvdW50cnluYW1lcyRuYW1lW21hdGNoKFdWNV9kYXRhJGNvdW50cnlfY29kZSwgY291bnRyeW5hbWVzJGNvZGUpXQoKIyBDaGVjayB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggY291bnRyeSBpbiB0aGUgbmV3IGNvbHVtbgp0YWJsZShXVjVfZGF0YSRjb3VudHJ5KQoKIyBEaXNwbGF5IHRoZSB1cGRhdGVkIFdWNV9kYXRhCnByaW50KFdWNV9kYXRhKQp1bmlxdWUoV1Y1X2RhdGEkY291bnRyeSkKCnByaW50KGNvdW50cnluYW1lcykKCmNvdW50cnlfY291bnRzIDwtIFdWNV9kYXRhICU+JQogIGNvdW50KGNvdW50cnkpCgojIFByaW50IHRoZSByZXN1bHQKcHJpbnQoY291bnRyeV9jb3VudHMpCgoKCmBgYApgYGB7cn0KI1JlYWQgRGF0YXNldCAoV2F2ZSA2KQoKV1Y2X2RhdGEgPC0gbG9hZCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL1dWNl9EYXRhX1JfdjIwMjAxMTE3LnJkYXRhIikgCldWNl9kYXRhIDwtIFdWNl9EYXRhX1JfdjIwMjAxMTE3IApwcmludChXVjZfZGF0YSkKYGBgCgpgYGB7cn0KV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgcmVuYW1lKHdhdmUgPSBWMSwgZ2VuZGVyID0gVjI0MCwgYWdlID0gVjI0Mixjb3VudHJ5X2NvZGUgPSBWMiwgcmlza3Rha2luZyA9IFY3NiwgY2hpbGRyZW4gPSBWNTgsIG1hcnJpZWQgPSBWNTcsIGVtcGxveWVkID0gVjIyOSwgZWR1Y2F0aW9uID0gVjI0OCkKCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdAoKV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdCh3YXZlLCBnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLHJpc2t0YWtpbmcsIGNoaWxkcmVuLCBtYXJyaWVkLCBlbXBsb3llZCwgZWR1Y2F0aW9uKQpXVjZfZGF0YQpgYGAKYGBge3J9CmNvdW50cnluYW1lcyA9IHJlYWQuY3N2KCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlcj1GQUxTRSxhcy5pcz1UUlVFKQpjb2xuYW1lcyhjb3VudHJ5bmFtZXMpID0gYygiY29kZSIsICJuYW1lIikKV1Y2X2RhdGEkY291bnRyeSA9IGNvdW50cnluYW1lcyRuYW1lIFttYXRjaChXVjZfZGF0YSRjb3VudHJ5X2NvZGUsIGNvdW50cnluYW1lcyRjb2RlKV0KdGFibGUoV1Y2X2RhdGEkY291bnRyeSkKV1Y2X2RhdGEKYGBgCmBgYHtyfQoKCgpXVlNfZGF0YSA9IHJiaW5kKFdWNV9kYXRhLCBXVjZfZGF0YSkKV1ZTX2RhdGEKCmNvdW50cnlfY291bnRzIDwtIFdWU19kYXRhICU+JQogIGNvdW50KGNvdW50cnkpCgojIFByaW50IHRoZSByZXN1bHQKcHJpbnQoY291bnRyeV9jb3VudHMpCgoKCgoKCgoKCgpgYGAKYGBge3J9CgoKCgpXVlNfZGF0YSA9IHN1YnNldChXVlNfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNSA9IHN1YnNldChXVjVfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNiA9IHN1YnNldChXVjZfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKV1ZTX2RhdGEgPC0gbmEub21pdChXVlNfZGF0YSkKZGF0YV9XYXZlNSA8LSBuYS5vbWl0KGRhdGFfV2F2ZTUpCmRhdGFfV2F2ZTYgPC0gbmEub21pdChkYXRhX1dhdmU2KQoKCgoKCgoKCgojIFVzZSB0aGUgbXV0YXRlIGZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgY291bnRyeSBuYW1lCldWU19kYXRhIDwtIFdWU19kYXRhICU+JQogIG11dGF0ZShjb3VudHJ5ID0gaWZlbHNlKGNvdW50cnkgPT0gIkdyZWF0IEJyaXRhaW4iLCAiVW5pdGVkIEtpbmdkb20iLCBjb3VudHJ5KSkKYGBgCmBgYHtyfQojIFRyYW5zZnJvbSByaXNrIGl0ZW0gc3VjaCB0aGF0IGhpZ2ggdmFsdWVzIHJlcHJlc2VudCBtb3JlIHJpc2sgdGFraW5nCldWU19kYXRhJHJpc2t0YWtpbmcgPSA2IC0gV1ZTX2RhdGEkcmlza3Rha2luZyArIDEKCiAgCiMgVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBULXNjb3JlIChtZWFuID0gNTAsIHNkID0gMTApCldWU19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyA9IDEwKnNjYWxlKFdWU19kYXRhJHJpc2t0YWtpbmcsIGNlbnRlcj1UUlVFLHNjYWxlPVRSVUUpKzUwCgpXVlNfZGF0YQoKI1RyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gWiBzY29yZSAKCiMgQXNzdW1pbmcgVC1zY29yZXMgaGF2ZSBhIG1lYW4gb2YgNTAgYW5kIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDEwCldWU19kYXRhJFpfc2NvcmVfcmlza3Rha2luZyA9IChXVlNfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgLSA1MCkgLyAxMAoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoV1ZTX2RhdGEpCgpXVlNfZGF0YSA8LSBXVlNfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoel9zY29yZV9hZ2UgPSBzY2FsZShhZ2UpKQpXVlNfZGF0YQoKY291bnRyeV9jb3VudHMgPC0gV1ZTX2RhdGEgJT4lCiAgY291bnQoY291bnRyeSkKCiMgUHJpbnQgdGhlIHJlc3VsdApwcmludChjb3VudHJ5X2NvdW50cykKCgoKCmBgYAoKYGBge3J9CgpXVlNfZGF0YSRnZW5kZXIgPSBpZmVsc2UoV1ZTX2RhdGEkZ2VuZGVyID09IDEsIDAsIDEpICMgc2V4OiBtYWxlIHZzLiBmZW1hbGUKV1ZTX2RhdGEkY2hpbGRyZW4gPSBpZmVsc2UoV1ZTX2RhdGEkY2hpbGRyZW4gPT0gMCwgMCwgMSkgIyBjaGlsZHJlbjogbm8gdnMuIHllcwpXVlNfZGF0YSRtYXJyaWVkID0gaWZlbHNlKFdWU19kYXRhJG1hcnJpZWQgPT0gMSwgMSwgMCkgIyBtYXJyaWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVtcGxveWVkID0gaWZlbHNlKFdWU19kYXRhJGVtcGxveWVkIDwgNCwgMSwgMCkgIyBlbXBsb3llZDogeWVzIHZzLiBubwpXVlNfZGF0YSRlZHVjYXRpb24gPSBpZmVsc2UoV1ZTX2RhdGEkZWR1Y2F0aW9uIDwgNCwgMCwgMSkgIyBlZHVjYXRpb246IG5vIHByaW1hcnkgdnMuIHByaW1hcnkrIAoKCmhhcmRzaGlwIDwtIGhhcmRzaGlwX2NvbXBsZXRlICU+JQogIGRwbHlyOjpzZWxlY3QobGFiZWwsIGNvZGUsIGhhcmRzaGlwX2luZGV4KQpoYXJkc2hpcAoKV1ZTX2RhdGEKCgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmhhcmRzaGlwIDwtIHJlbmFtZShoYXJkc2hpcCwgY291bnRyeSA9IGxhYmVsKQoKV1ZTX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihXVlNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpXVlNfbWl4ZWRfbW9kZWwKaGVhZChXVlNfbWl4ZWRfbW9kZWwpCgpjb2xuYW1lcyhXVlNfZGF0YSkKY29sbmFtZXMoaGFyZHNoaXApCgp1bmlxdWUoV1ZTX2RhdGEkY291bnRyeSkKCldWU19taXhlZF9tb2RlbAoKdW5pcXVlKFdWU19taXhlZF9tb2RlbCRjb3VudHJ5KQpgYGAKYGBge3J9CmxpYnJhcnkobG1lclRlc3QpCgojIGludGVyY2VwdCBvbmx5IG1vZGVsCm1vZGVsMCA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArICgxfGNvdW50cnkpLGRhdGEgPSBXVlNfbWl4ZWRfbW9kZWwpCnN1bW1hcnlfbW9kZWwwPXN1bW1hcnkobW9kZWwwKQpzdW1tYXJ5X21vZGVsMApgYGAKYGBge3J9CiMgYWdlLCBzZXggCm1vZGVsMSA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArc2NhbGUoYWdlKStmYWN0b3IoZ2VuZGVyKSArICgxK3NjYWxlKGFnZSkrZmFjdG9yKGdlbmRlcil8Y291bnRyeSksZGF0YSA9IFdWU19taXhlZF9tb2RlbCwgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDApKSkKc3VtbWFyeV9tb2RlbDE9c3VtbWFyeShtb2RlbDEpCnN1bW1hcnlfbW9kZWwxCmBgYAoKYGBge3J9CiNtb2RlbCAyCmxpYnJhcnkobG1lNCkKCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKCiMgRGVmaW5lIHRoZSBsbWVyIG1vZGVsIGFuZCBhc3NpZ24gaXQgdG8gJ21vZGVsXzInCgpvcHRpb25zKHNjaXBlbiA9IDEwMCkKbW9kZWxfMiA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pICsgKDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMCkpKQoKCiMgRGlzcGxheSB0aGUgc3VtbWFyeSBvZiB0aGUgbW9kZWwKc3VtbWFyeV9tb2RlbF8yID0gc3VtbWFyeShtb2RlbF8yKQpzdW1tYXJ5X21vZGVsXzIKCldWU19taXhlZF9tb2RlbAoKCmBgYAoKCmBgYHtyfQpvcHRpb25zKHNjaXBlbiA9IDEwMCkKbW9kZWxfMyA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICogaGFyZHNoaXBfaW5kZXggKyAKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZ2VuZGVyKSAqIGhhcmRzaGlwX2luZGV4ICsgZmFjdG9yKGNoaWxkcmVuKSArIGZhY3RvcihtYXJyaWVkKSArIGZhY3RvcihlbXBsb3llZCkgKyBmYWN0b3IoZWR1Y2F0aW9uKSArIAogICAgICAgICAgICAgICAgICAgICgxICsgc2NhbGUoYWdlKSArIGZhY3RvcihnZW5kZXIpKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLGNvbnRyb2w9bG1lckNvbnRyb2wob3B0Q3RybD1saXN0KG1heGZ1bj0xMDAwMDApLG9wdGltaXplcj0iYm9ieXFhIiksUkVNTCA9IEZBTFNFKQoKc3VtbWFyeV9tb2RlbF8zID0gc3VtbWFyeShtb2RlbF8zKSAKCnN1bW1hcnlfbW9kZWxfMwoKCmBgYAoKYGBge3J9CiMgRGVmaW5lIGFub3ZhX3Jlc3VsdHMgbGlzdCB3aXRoIG11bHRpcGxlIGFub3ZhKCkgY2FsbHMKYW5vdmFfcmVzdWx0cyA8LSBsaXN0KAogIGFub3ZhKG1vZGVsMCwgbW9kZWwxKSwKICBhbm92YShtb2RlbDEsIG1vZGVsXzIpLAogIGFub3ZhKG1vZGVsXzIsIG1vZGVsXzMpCikKCmFub3ZhX3Jlc3VsdHMKCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkodGliYmxlKQoKCgpsaWJyYXJ5KGRwbHlyKQojIEZvcm1hdCBBTk9WQSByZXN1bHRzIGludG8gYSB0aWR5IGRhdGEgZnJhbWUKYW5vdmFfc3VtbWFyeSA8LSBiaW5kX3Jvd3MobGFwcGx5KGFub3ZhX3Jlc3VsdHMsIHRpZHkpLCAuaWQgPSAiQ29tcGFyaXNvbiIpCgojIFByaW50IHRoZSBzdW1tYXJ5IHRhYmxlCnByaW50KGFub3ZhX3N1bW1hcnkpCgpgYGAKYGBge3J9CiMgRXh0cmFjdCByYW5kb20gZWZmZWN0cyBmb3IgJ2NvdW50cnknCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyB5b3VyIGZpdHRlZCBsbWVyIG1vZGVsCnJhbmRvbV9lZmZlY3RzIDwtIHJhbmVmKG1vZGVsXzIpCnJhbmRvbV9lZmZlY3RzCgoKCgoKCmBgYApgYGB7cn0KcmVncmVzc2lvbl9yZXN1bHRzX1dWUyA8LSBXVlNfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBkbyhtb2RlbCA9IGxtKFpfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKGFnZSkgKyBnZW5kZXIsIGRhdGEgPSAuKSkgJT4lCiAgc3VtbWFyaXplKAogICAgY291bnRyeSA9IGZpcnN0KGNvdW50cnkpLAogICAgaW50ZXJjZXB0X3JlZ3Jlc3Npb24gPSBjb2VmKHN1bW1hcnkobW9kZWwpKVsxLCAxXSwKICAgIHNsb3BlX2FnZV9yZWdyZXNzaW9uID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMiwgMV0sCiAgICBzbG9wZV9nZW5kZXJfcmVncmVzc2lvbiA9IGNvZWYoc3VtbWFyeShtb2RlbCkpWzMsIDFdCiAgKQoKcmVncmVzc2lvbl9yZXN1bHRzX1dWUwoKcmFuZG9tX2VmZmVjdHMgPC0gcmFuZWYobW9kZWxfMikKcmFuZG9tX2VmZmVjdHMKCmNvbG5hbWVzKHJhbmRvbV9lZmZlY3RzKQoKCgoKCgoKCgoKCgoKCgoKYGBgCgpgYGB7cn0KY29lZnNhbGxtb2RlbHM9cmJpbmQoc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzIkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzMkY29lZmZpY2llbnRzW2MoMToyLDQ6OCwzLDk6MTApLF0pCgp3cml0ZS5jc3YoY29lZnNhbGxtb2RlbHMsImNvZWZzYWxsbW9kZWxzLmNzdiIpCmBgYAoKCmBgYHtyfQojIFJlYWQgdGhlIENTViBmaWxlIGludG8gYSBkYXRhIGZyYW1lCmdiZF9tZW50YWxoZWFsdGggPC0gcmVhZF9leGNlbCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL0dCRF9tZW50YWxoZWFsdGgueGxzeCIpCgpnYmRfbWVudGFsaGVhbHRoCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApnYmRfbWVudGFsaGVhbHRoIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBnZW5kZXIsIGFnZSwgY2F1c2UsIHZhbCwgTWVhc3VyZSkKZ2JkX21lbnRhbGhlYWx0aAoKCmxpYnJhcnkoZHBseXIpCgojIEdyb3VwIGRhdGEgYnkgY291bnRyeSBhbmQgYWdlIGdyb3VwLCBhbmQgY2FsY3VsYXRlIHN1bW1hcnkgc3RhdGlzdGljcwpzdW1tYXJ5X2J5X2NvdW50cnlfYWdlIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuX0RBTFlzID0gbWVhbih2YWwpKSAgIyBDYWxjdWxhdGUgbWVhbiBvZiBEQUxZcwoKbGlicmFyeShkcGx5cikKCiMgQXNzdW1pbmcgJ3N1bW1hcnlfYnlfY291bnRyeV9hZ2UnIGNvbnRhaW5zIHlvdXIgc3VtbWFyaXplZCBkYXRhc2V0Cm1lYW5fYnlfY291bnRyeSA8LSBzdW1tYXJ5X2J5X2NvdW50cnlfYWdlICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0RBTFlzID0gbWVhbihtZWFuX0RBTFlzKSkKCiMgVmlldyB0aGUgcmVzdWx0aW5nIG1lYW4gYnkgY291bnRyeQpwcmludChtZWFuX2J5X2NvdW50cnkpCgojbG9nIHRyYW5zZm9ybQptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1sb2cobWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXMpCiAKbWVhbl9ieV9jb3VudHJ5IAoKI1JldmVyc2UgY29kaWVydW5nIAptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1zY2FsZShtZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcykKCm1lYW5fYnlfY291bnRyeQoKI3JlbmFtZSBtZWFuX0RBTFlTCm1lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVhbl9ieV9jb3VudHJ5ICU+JQogIHJlbmFtZSgnbWVudGFsX2hlYWx0aCcgPSBtZWFuX0RBTFlzKQptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCgojIyMjIyMjQW54aWV0eSBkaXNvcmRlcnMjIyMjIyMjIyMKI0ZpbHRlciBkYXRhIGZvciBhIHNwZWNpZmljIG1lbnRhbCBkaXNvcmRlciAoZS5nLiwgQW54aWV0eSBEaXNvcmRlcnMpCmFueGlldHlfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBbnhpZXR5IGRpc29yZGVycyIpICAjIENoYW5nZSAiQW54aWV0eSBEaXNvcmRlcnMiIHRvIHRoZSBkZXNpcmVkIGRpc29yZGVyCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoRGlzYWJpbGl0eS1BZGp1c3RlZCBMaWZlIFllYXJzKSBhY3Jvc3MgbG9jYXRpb25zIGFuZCBhZ2VzCm1lYW5fREFMWXMgPC0gbWVhbihhbnhpZXR5X2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGlmIHlvdSB3YW50IHRvIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnk6CmFueGlldHlfZGlzb3JkZXJzIDwtIGFueGlldHlfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0FueGlldHlfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKYW54aWV0eV9kaXNvcmRlcnMKCiNsb2cgdHJhbnNmb3JtCmFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnM9bG9nKGFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnMpCiAKYW54aWV0eV9kaXNvcmRlcnMKCiNSZXZlcnNlIGNvZGllcnVuZyAKYW54aWV0eV9kaXNvcmRlcnMkbWVhbl9BbnhpZXR5X2Rpc29yZGVycz1zY2FsZShhbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzKQphbnhpZXR5X2Rpc29yZGVycwptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmdiZF9tZW50YWxoZWFsdGgKCiMgQXNzdW1pbmcgZ2JkX21lbnRhbGhlYWx0aCBpcyB5b3VyIGRhdGEgZnJhbWUgY29udGFpbmluZyB0aGUgJ2NhdXNlJyBjb2x1bW4KCiMgR2V0IHVuaXF1ZSB2YWx1ZXMgb2YgJ2NhdXNlJyBjb2x1bW4KdW5pcXVlX2NhdXNlcyA8LSB1bmlxdWUoZ2JkX21lbnRhbGhlYWx0aCRjYXVzZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHVuaXF1ZSBjYXVzZXMKY2F1c2VfdGFibGUgPC0gZGF0YS5mcmFtZShDYXVzZSA9IHVuaXF1ZV9jYXVzZXMpCgojIFByaW50IHRoZSBjYXVzZSB0YWJsZQpwcmludChjYXVzZV90YWJsZSkKCgpgYGAKYGBge3J9CiMjIyMjIyNCdWxpbWlhIG5lcnZvc2EjIyMjIyMjIwpsaWJyYXJ5KGRwbHlyKQoKIyBGaWx0ZXIgdGhlIGRhdGEgZm9yICdCdWxpbWlhIE5lcnZvc2EnCmJ1bGltaWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQnVsaW1pYSBuZXJ2b3NhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGJ1bGltaWFfbmVydm9zYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYnVsaW1pYV9uZXJ2b3NhIDwtIGJ1bGltaWFfbmVydm9zYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9idWxpbWlhX25lcnZvc2EgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gbG9nKGJ1bGltaWFfbmVydm9zYSRtZWFuX2J1bGltaWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gc2NhbGUoYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoYnVsaW1pYV9uZXJ2b3NhKQpwcmludChhbnhpZXR5X2Rpc29yZGVycykKCmdiZF9tZW50YWxoZWFsdGgKCmBgYApgYGB7cn0KIyMjIyNBdHRlbnRpb24tZGVmaWNpdC9oeXBlcmFjdGl2aXR5IGRpc29yZGVyCmxpYnJhcnkoZHBseXIpCgoKQURIRCA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQXR0ZW50aW9uLWRlZmljaXQvaHlwZXJhY3Rpdml0eSBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihBREhEJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpBREhEIDwtIEFESEQgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fQURIRCA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCkFESEQkbWVhbl9BREhEIDwtIGxvZyhBREhEJG1lYW5fQURIRCkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpBREhEJG1lYW5fQURIRCA8LSBzY2FsZShBREhEJG1lYW5fQURIRCkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KEFESEQpCgpgYGAKYGBge3J9CiMjIyMjIyMjI0lkaW9wYXRoaWMgZGV2ZWxvcG1lbnQgaW50ZWxsZWN0dWFsIGFiaWxpdHkgCmxpYnJhcnkoZHBseXIpCgoKSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5IDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJJZGlvcGF0aGljIGRldmVsb3BtZW50YWwgaW50ZWxsZWN0dWFsIGRpc2FiaWxpdHkiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5ICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBsb2coSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JG1lYW5fSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBzY2FsZShJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCmBgYApgYGB7cn0KIyMjIyMjQW5vcmV4aWEgTmVydm9zYQoKYW5vcmV4aWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQW5vcmV4aWEgbmVydm9zYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbm9yZXhpYV9uZXJ2b3NhJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphbm9yZXhpYV9uZXJ2b3NhIDwtIGFub3JleGlhX25lcnZvc2EgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYW5vcmV4aWFfbmVydm9zYSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmFub3JleGlhX25lcnZvc2EkbWVhbl9hbm9yZXhpYV9uZXJ2b3NhIDwtIGxvZyhhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQphbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSA8LSBzY2FsZShhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFub3JleGlhX25lcnZvc2EpCmBgYApgYGB7cn0KIyMjIyNEZXByZXNzaXZlIGRpc29yZGVycyMjIyMjIyMKCmRlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJEZXByZXNzaXZlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkZXByZXNzaXZlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gZGVwcmVzc2l2ZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGxvZyhkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmRlcHJlc3NpdmVfZGlzb3JkZXJzJG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gc2NhbGUoZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGRlcHJlc3NpdmVfZGlzb3JkZXJzKQpgYGAKCmBgYHtyfQojIyMjIyMjQXV0aXNtdXMgc3BlY3RydW0gZGlzb3JkZXJzIyMjIyMjCgphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkF1dGlzbSBzcGVjdHJ1bSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBsb2coYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJG1lYW5fYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBzY2FsZShhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCmBgYAoKYGBge3J9CiMjIyMjI1NjaGl6b3BocmVuaWEjIyMjIyMjCnNjaGl6b3BocmVuaWEgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlNjaGl6b3BocmVuaWEiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oc2NoaXpvcGhyZW5pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKc2NoaXpvcGhyZW5pYSA8LSBzY2hpem9waHJlbmlhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX3NjaGl6b3BocmVuaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpzY2hpem9waHJlbmlhJG1lYW5fc2NoaXpvcGhyZW5pYSA8LSBsb2coc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEgPC0gc2NhbGUoc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChzY2hpem9waHJlbmlhKQoKYGBgCgpgYGB7cn0KIyMjIyMjI0NvbmR1Y3QgZGlzb3JkZXJzIyMjIyMjIyMjCmNvbmR1Y3RfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJDb25kdWN0IGRpc29yZGVyIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGNvbmR1Y3RfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpjb25kdWN0X2Rpc29yZGVycyA8LSBjb25kdWN0X2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9jb25kdWN0X2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPC0gbG9nKGNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKY29uZHVjdF9kaXNvcmRlcnMkbWVhbl9jb25kdWN0X2Rpc29yZGVycyA8LSBzY2FsZShjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoY29uZHVjdF9kaXNvcmRlcnMpCgoKYGBgCgpgYGB7cn0KIyMjIyMjIyNFYXRpbmcgZGlzb3JkZXJzIyMjIyMjIyMjCmVhdGluZ19kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkVhdGluZyBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oZWF0aW5nX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZWF0aW5nX2Rpc29yZGVycyA8LSBlYXRpbmdfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2VhdGluZ19kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgplYXRpbmdfZGlzb3JkZXJzJG1lYW5fZWF0aW5nX2Rpc29yZGVycyA8LSBsb2coZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMgPC0gc2NhbGUoZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChlYXRpbmdfZGlzb3JkZXJzKQoKYGBgCmBgYHtyfQojIyMjIyMjI0JpcG9sYXIgZGlzb3JkZXIjIyMjIyMjIyMKYmlwb2xhcl9kaXNvcmRlciA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQmlwb2xhciBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihiaXBvbGFyX2Rpc29yZGVyJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpiaXBvbGFyX2Rpc29yZGVyIDwtIGJpcG9sYXJfZGlzb3JkZXIgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYmlwb2xhcl9kaXNvcmRlciA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmJpcG9sYXJfZGlzb3JkZXIkbWVhbl9iaXBvbGFyX2Rpc29yZGVyIDwtIGxvZyhiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlciA8LSBzY2FsZShiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGJpcG9sYXJfZGlzb3JkZXIpCgpgYGAKYGBge3J9CnByaW50KGNhdXNlX3RhYmxlKQpgYGAKYGBge3J9CiMjIyMjIyMjU3Vic3RhbmNlIHVzZSBkaXNvcmRlcnMjIyMjIyMjIwoKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlN1YnN0YW5jZSB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gbG9nKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMkbWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzY2FsZShzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgpgYGAKYGBge3J9CiMjIyNEcnVnIHVzZSBkaXNvcmRlcnMKCmRydWdfdXNlX2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHJ1ZyB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGRydWdfdXNlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHJ1Z191c2VfZGlzb3JkZXJzIDwtIGRydWdfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gbG9nKGRydWdfdXNlX2Rpc29yZGVycyRtZWFuX2RydWdfdXNlX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gc2NhbGUoZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHJ1Z191c2VfZGlzb3JkZXJzKQoKCmBgYApgYGB7cn0KIyMjIyMjIyMjI0FsY29ob2wgdXNlIGRpc29yZGVycwphbGNvaG9sX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkFsY29ob2wgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmFsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBhbGNvaG9sX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIGxvZyhhbGNvaG9sX3VzZV9kaXNvcmRlcnMkbWVhbl9hbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIHNjYWxlKGFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFsY29ob2xfdXNlX2Rpc29yZGVycykKCmBgYApgYGB7cn0KIyMjIyMjI01ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXJzCm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIk1ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgptYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyJG1lYW5fbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBsb2cobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gc2NhbGUobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKYGBgCmBgYHtyfQojIyMjIyMjRHlzdGh5bWlhIyMjIyMjIyMKCmR5c3RoeW1pYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHlzdGh5bWlhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGR5c3RoeW1pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHlzdGh5bWlhIDwtIGR5c3RoeW1pYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9keXN0aHltaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gbG9nKGR5c3RoeW1pYSRtZWFuX2R5c3RoeW1pYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gc2NhbGUoZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHlzdGh5bWlhKQoKCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKCiMgUGVyZm9ybSBsZWZ0IGpvaW5zIGZvciBlYWNoIGRhdGEgZnJhbWUgb24gJ2NvdW50cnknCmZpbmFsX21lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVudGFsX2hlYWx0aF9pbmRleCAlPiUKICBsZWZ0X2pvaW4oYnVsaW1pYV9uZXJ2b3NhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKEFESEQsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5LCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGFub3JleGlhX25lcnZvc2EsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZGVwcmVzc2l2ZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGNvbmR1Y3RfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKHNjaGl6b3BocmVuaWEsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZWF0aW5nX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihiaXBvbGFyX2Rpc29yZGVyLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGRydWdfdXNlX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihkeXN0aHltaWEsIGJ5ID0gImNvdW50cnkiKQoKIyBEaXNwbGF5IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKIyBTaG93IHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKaGVhZChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKYGBgCmBgYHtyfQppbmRpY2F0b3JzIDwtIGxlZnRfam9pbihmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4LCBoYXJkc2hpcCwgYnkgPSAiY291bnRyeSIpCmluZGljYXRvcnMKaGVhZChpbmRpY2F0b3JzKQoKbmV3X2RhdGEgPC0gbGVmdF9qb2luIChXVlNfZGF0YSwgaW5kaWNhdG9ycywgYnkgPSAiY291bnRyeSIpCm5ld19kYXRhCgoKIyBUcmFuc2Zyb20gcmlzayBpdGVtIHN1Y2ggdGhhdCBoaWdoIHZhbHVlcyByZXByZXNlbnQgbW9yZSByaXNrIHRha2luZwpuZXdfZGF0YSRyaXNrdGFraW5nID0gNiAtIG5ld19kYXRhJHJpc2t0YWtpbmcgKyAxCgogIAojIFRyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gVC1zY29yZSAobWVhbiA9IDUwLCBzZCA9IDEwKQpuZXdfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgPSAxMCpzY2FsZShuZXdfZGF0YSRyaXNrdGFraW5nLCBjZW50ZXI9VFJVRSxzY2FsZT1UUlVFKSs1MAoKbmV3X2RhdGEKCiNUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFogc2NvcmUgCgojIEFzc3VtaW5nIFQtc2NvcmVzIGhhdmUgYSBtZWFuIG9mIDUwIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxMApuZXdfZGF0YSRaX3Njb3JlX3Jpc2t0YWtpbmcgPSAobmV3X2RhdGEkVF9zY29yZV9yaXNrdGFraW5nIC0gNTApIC8gMTAKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KG5ld19kYXRhKQoKbmV3X2RhdGEgPC0gbmV3X2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHpfc2NvcmVfYWdlID0gc2NhbGUoYWdlKSkKbmV3X2RhdGEKYGBgCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCgpsaWJyYXJ5KGxtZTQpCgptb2RlbCA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKHpfc2NvcmVfYWdlKSAqIG1lbnRhbF9oZWFsdGggKwogICAgICAgICAgICAgICBnZW5kZXIgKiBtZW50YWxfaGVhbHRoICsKICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArCiAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSArCiAgICAgICAgICAgICAgICgxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpIHwgY291bnRyeSksCiAgICAgICAgICAgICBkYXRhID0gbmV3X2RhdGEsIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMTAwMDAwKSkpCgoKc3VtbWFyeShtb2RlbCkKCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyBhIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVsIChsbWVyKSwgYW5kIHlvdSB3YW50IHRvIHNhdmUgY29lZmZpY2llbnRzIHRvIGEgQ1NWIGZpbGUKCiMgRXh0cmFjdCBjb2VmZmljaWVudHMgZnJvbSB0aGUgbW9kZWwgc3VtbWFyeQpjb2VmZmljaWVudHNfZGYgPC0gZGF0YS5mcmFtZShzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHMpCgojIFdyaXRlIGNvZWZmaWNpZW50cyB0byBhIENTViBmaWxlCndyaXRlLmNzdihjb2VmZmljaWVudHNfZGYsICJtb2RlbF9jb2VmZmljaWVudHMuY3N2Iiwgcm93Lm5hbWVzID0gVFJVRSkKCmBgYApgYGB7cn0KCmBgYAoKCmBgYAoKCgo=
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4KCiMjIFRlc3QgVGVzdCBUZXN0CgpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKYGBgCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ21kK09wdGlvbitJKi4KCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ21kK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuIAoKVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLgoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpoYXJkc2hpcF9jb21wbGV0ZSA8LSByZWFkX2V4Y2VsKCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9IYXJkc2hpcF9jb21wbGV0ZS54bHN4IikKaGFyZHNoaXBfY29tcGxldGUKCgpgYGAKYGBge3J9CmhhcmRzaGlwX2NvbXBsZXRlJG1lYW5faG9taWNpZGU9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJG1lYW5faG9taWNpZGUpCmhhcmRzaGlwX2NvbXBsZXRlJGdkcD1sb2coaGFyZHNoaXBfY29tcGxldGUkZ2RwKQpoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5KQpoYXJkc2hpcF9jb21wbGV0ZSRsaWZlX2V4cGVjdD1sb2coaGFyZHNoaXBfY29tcGxldGUkbGlmZV9leHBlY3QpCmhhcmRzaGlwX2NvbXBsZXRlJGdpbmlfaW5jb21lPWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRnaW5pX2luY29tZSkKaGFyZHNoaXBfY29tcGxldGUkYHByaW1hcnlfIGZlbWFsZV8gZW5yb2xsbWVudF8gcmF0ZWA9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJGBwcmltYXJ5XyBmZW1hbGVfIGVucm9sbG1lbnRfIHJhdGVgKQpoYXJkc2hpcF9jb21wbGV0ZQoKIyBSZXZlcnNlIENvZGllcnVuZwpoYXJkc2hpcF9jb21wbGV0ZSRtZWFuX2hvbWljaWRlPXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJG1lYW5faG9taWNpZGUpCmhhcmRzaGlwX2NvbXBsZXRlJGdkcD1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkZ2RwKQpoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5PXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJEluZmFudF9tb3J0YWxpdHkpCmhhcmRzaGlwX2NvbXBsZXRlJGxpZmVfZXhwZWN0PXNjYWxlKC1oYXJkc2hpcF9jb21wbGV0ZSRsaWZlX2V4cGVjdCkKaGFyZHNoaXBfY29tcGxldGUkZ2luaV9pbmNvbWU9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkZ2luaV9pbmNvbWUpCmhhcmRzaGlwX2NvbXBsZXRlJGdpbmlfaW5jb21lPXNjYWxlKC1oYXJkc2hpcF9jb21wbGV0ZSRgcHJpbWFyeV8gZmVtYWxlXyBlbnJvbGxtZW50XyByYXRlYCkKaGFyZHNoaXBfY29tcGxldGUKCmhhcmRzaGlwX2NvbXBsZXRlJGhhcmRzaGlwX2luZGV4PShoYXJkc2hpcF9jb21wbGV0ZSRtZWFuX2hvbWljaWRlK2hhcmRzaGlwX2NvbXBsZXRlJGdkcCtoYXJkc2hpcF9jb21wbGV0ZSRnaW5pX2luY29tZStoYXJkc2hpcF9jb21wbGV0ZSRsaWZlX2V4cGVjdCtoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5K2hhcmRzaGlwX2NvbXBsZXRlJGBwcmltYXJ5XyBmZW1hbGVfIGVucm9sbG1lbnRfIHJhdGVgKS82CgpoYXJkc2hpcF9jb21wbGV0ZQoKCmBgYApgYGB7cn0KCiMgRGF0YSBvZiBXYXZlIDUKCgpXVjVfZGF0YSA8LSByZWFkUkRTKCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvRjAwMDA3OTQ0LVdWNV9EYXRhX1JfdjIwMTgwOTEyLnJkcyIpCgoKIyBDb252ZXJ0IFdWNV9kYXRhLW9iamVjdCBpbiBkYXRhLmZyYW1lIApXVjVfZGF0YV9kZiA8LSBhcy5kYXRhLmZyYW1lKFdWNV9kYXRhKQoKIyBzaG93IGZpcnN0IGZpdmUgY29sdW1ucwpXVjVfZGF0YV9kZgpgYGAKCmBgYHtyfQojcmVuYW1lIHRoZSB2YXJpYWJsZXMKV1Y1X2RhdGEgPC0gV1Y1X2RhdGFfZGYgJT4lCiAgcmVuYW1lKGdlbmRlciA9IFYyMzUsIGFnZSA9IFYyMzcsIGNvdW50cnlfY29kZSA9IFYyLCB3YXZlID0gVjEsIHJpc2t0YWtpbmcgPSBWODYsIGNoaWxkcmVuID0gVjU2LCBtYXJyaWVkID0gVjU1LCBlbXBsb3llZCA9IFYyNDEsIGVkdWNhdGlvbiA9IFYyMzgpCldWNV9kYXRhCgpjb2xuYW1lcyhXVjVfZGF0YSkKCgoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKV1Y1X2RhdGEgPC0gV1Y1X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLCB3YXZlLCByaXNrdGFraW5nLCBjaGlsZHJlbiwgbWFycmllZCwgZW1wbG95ZWQsIGVkdWNhdGlvbikKV1Y1X2RhdGEKYGBgCmBgYHtyfQojIFJlYWQgY291bnRyeW5hbWVzIGRhdGEgZnJvbSB0aGUgQ1NWIGZpbGUgKHRvIGRlY29kZSB0aGUgZGF0YXNldCA1KQpjb3VudHJ5bmFtZXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9jb3VudHJ5bmFtZXMudHh0IiwgaGVhZGVyID0gRkFMU0UsIGFzLmlzID0gVFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA8LSBjKCJjb2RlIiwgIm5hbWUiKQoKIyBBc3N1bWluZyBXVjVfZGF0YSBoYXMgYSBjb2x1bW4gbmFtZWQgY291bnRyeV9jb2RlCldWNV9kYXRhJGNvdW50cnkgPC0gY291bnRyeW5hbWVzJG5hbWVbbWF0Y2goV1Y1X2RhdGEkY291bnRyeV9jb2RlLCBjb3VudHJ5bmFtZXMkY29kZSldCgojIENoZWNrIHRoZSBmcmVxdWVuY3kgb2YgZWFjaCBjb3VudHJ5IGluIHRoZSBuZXcgY29sdW1uCnRhYmxlKFdWNV9kYXRhJGNvdW50cnkpCgojIERpc3BsYXkgdGhlIHVwZGF0ZWQgV1Y1X2RhdGEKcHJpbnQoV1Y1X2RhdGEpCmBgYApgYGB7cn0KI1JlYWQgRGF0YXNldCAoV2F2ZSA2KQoKV1Y2X2RhdGEgPC0gbG9hZCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL1dWNl9EYXRhX1JfdjIwMjAxMTE3LnJkYXRhIikgCldWNl9kYXRhIDwtIFdWNl9EYXRhX1JfdjIwMjAxMTE3IApwcmludChXVjZfZGF0YSkKYGBgCgpgYGB7cn0KV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgcmVuYW1lKHdhdmUgPSBWMSwgZ2VuZGVyID0gVjI0MCwgYWdlID0gVjI0Mixjb3VudHJ5X2NvZGUgPSBWMiwgcmlza3Rha2luZyA9IFY3NiwgY2hpbGRyZW4gPSBWNTgsIG1hcnJpZWQgPSBWNTcsIGVtcGxveWVkID0gVjIyOSwgZWR1Y2F0aW9uID0gVjI0OCkKCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdAoKV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdCh3YXZlLCBnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLHJpc2t0YWtpbmcsIGNoaWxkcmVuLCBtYXJyaWVkLCBlbXBsb3llZCwgZWR1Y2F0aW9uKQpXVjZfZGF0YQpgYGAKYGBge3J9CmNvdW50cnluYW1lcyA9IHJlYWQuY3N2KCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlcj1GQUxTRSxhcy5pcz1UUlVFKQpjb2xuYW1lcyhjb3VudHJ5bmFtZXMpID0gYygiY29kZSIsICJuYW1lIikKV1Y2X2RhdGEkY291bnRyeSA9IGNvdW50cnluYW1lcyRuYW1lIFttYXRjaChXVjZfZGF0YSRjb3VudHJ5X2NvZGUsIGNvdW50cnluYW1lcyRjb2RlKV0KdGFibGUoV1Y2X2RhdGEkY291bnRyeSkKV1Y2X2RhdGEKYGBgCmBgYHtyfQpXVjVfZGF0YQpXVjZfZGF0YQpXVlNfZGF0YSA9IHJiaW5kKFdWNV9kYXRhLCBXVjZfZGF0YSkKV1ZTX2RhdGEKCnVuaXF1ZShXVlNfZGF0YSRhZ2UpCnJhbmdlKFdWU19kYXRhJGFnZSkKYGBgCmBgYHtyfQpXVlNfZGF0YSA9IHN1YnNldChXVlNfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNSA9IHN1YnNldChXVjVfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNiA9IHN1YnNldChXVjZfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKV1ZTX2RhdGEgPC0gbmEub21pdChXVlNfZGF0YSkKZGF0YV9XYXZlNSA8LSBuYS5vbWl0KGRhdGFfV2F2ZTUpCmRhdGFfV2F2ZTYgPC0gbmEub21pdChkYXRhX1dhdmU2KQoKCiMgVXNlIHRoZSBtdXRhdGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjb3VudHJ5IG5hbWUKV1ZTX2RhdGEgPC0gV1ZTX2RhdGEgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UoY291bnRyeSA9PSAiR3JlYXQgQnJpdGFpbiIsICJVbml0ZWQgS2luZ2RvbSIsIGNvdW50cnkpKQpgYGAKYGBge3J9CiMgVHJhbnNmcm9tIHJpc2sgaXRlbSBzdWNoIHRoYXQgaGlnaCB2YWx1ZXMgcmVwcmVzZW50IG1vcmUgcmlzayB0YWtpbmcKV1ZTX2RhdGEkcmlza3Rha2luZyA9IDYgLSBXVlNfZGF0YSRyaXNrdGFraW5nICsgMQoKICAKIyBUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFQtc2NvcmUgKG1lYW4gPSA1MCwgc2QgPSAxMCkKV1ZTX2RhdGEkVF9zY29yZV9yaXNrdGFraW5nID0gMTAqc2NhbGUoV1ZTX2RhdGEkcmlza3Rha2luZywgY2VudGVyPVRSVUUsc2NhbGU9VFJVRSkrNTAKCldWU19kYXRhCgojVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBaIHNjb3JlIAoKIyBBc3N1bWluZyBULXNjb3JlcyBoYXZlIGEgbWVhbiBvZiA1MCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMTAKV1ZTX2RhdGEkWl9zY29yZV9yaXNrdGFraW5nID0gKFdWU19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyAtIDUwKSAvIDEwCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChXVlNfZGF0YSkKCldWU19kYXRhIDwtIFdWU19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCldWU19kYXRhCmBgYAoKYGBge3J9CgpXVlNfZGF0YSRnZW5kZXIgPSBpZmVsc2UoV1ZTX2RhdGEkZ2VuZGVyID09IDEsIDAsIDEpICMgc2V4OiBtYWxlIHZzLiBmZW1hbGUKV1ZTX2RhdGEkY2hpbGRyZW4gPSBpZmVsc2UoV1ZTX2RhdGEkY2hpbGRyZW4gPT0gMCwgMCwgMSkgIyBjaGlsZHJlbjogbm8gdnMuIHllcwpXVlNfZGF0YSRtYXJyaWVkID0gaWZlbHNlKFdWU19kYXRhJG1hcnJpZWQgPT0gMSwgMSwgMCkgIyBtYXJyaWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVtcGxveWVkID0gaWZlbHNlKFdWU19kYXRhJGVtcGxveWVkIDwgNCwgMSwgMCkgIyBlbXBsb3llZDogeWVzIHZzLiBubwpXVlNfZGF0YSRlZHVjYXRpb24gPSBpZmVsc2UoV1ZTX2RhdGEkZWR1Y2F0aW9uIDwgNCwgMCwgMSkgIyBlZHVjYXRpb246IG5vIHByaW1hcnkgdnMuIHByaW1hcnkrIAoKCmhhcmRzaGlwIDwtIGhhcmRzaGlwX2NvbXBsZXRlICU+JQogIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgaXNvY29kZSwgaGFyZHNoaXBfaW5kZXgpCmhhcmRzaGlwCmBgYApgYGB7cn0KV1ZTX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihXVlNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpXVlNfbWl4ZWRfbW9kZWwKaGVhZChXVlNfbWl4ZWRfbW9kZWwpCmBgYApgYGB7cn0KbGlicmFyeShsbWVyVGVzdCkKCiMgaW50ZXJjZXB0IG9ubHkgbW9kZWwKbW9kZWwwID0gbG1lcihaX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICsgKDF8Y291bnRyeSksZGF0YSA9IFdWU19taXhlZF9tb2RlbCkKc3VtbWFyeV9tb2RlbDA9c3VtbWFyeShtb2RlbDApCnN1bW1hcnlfbW9kZWwwCmBgYApgYGB7cn0KIyBhZ2UsIHNleCAKbW9kZWwxID0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICtzY2FsZSh6X3Njb3JlX2FnZSkrZmFjdG9yKGdlbmRlcikgKyAoMStzY2FsZSh6X3Njb3JlX2FnZSkrZmFjdG9yKGdlbmRlcil8Y291bnRyeSksZGF0YSA9IFdWU19taXhlZF9tb2RlbCkKc3VtbWFyeV9tb2RlbDE9c3VtbWFyeShtb2RlbDEpCnN1bW1hcnlfbW9kZWwxCmBgYAoKYGBge3J9CiNtb2RlbCAyCmxpYnJhcnkobG1lNCkKCmxpYnJhcnkobG1lNCkKCiMgRGVmaW5lIHRoZSBsbWVyIG1vZGVsIGFuZCBhc3NpZ24gaXQgdG8gJ21vZGVsXzInCm1vZGVsXzIgPC0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgCiAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pICsgCiAgICAgICAgICAgICAgICAgKDEgKyBzY2FsZSh6X3Njb3JlX2FnZSkgKyBmYWN0b3IoZ2VuZGVyKSArIGZhY3RvcihjaGlsZHJlbikgKyAKICAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX2RhdGEpCgojIERpc3BsYXkgdGhlIHN1bW1hcnkgb2YgdGhlIG1vZGVsCnN1bW1hcnkobW9kZWxfMikKYGBgCgoKYGBge3J9Cm1vZGVsXzMgPC0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICsgc2NhbGUoel9zY29yZV9hZ2UpICogaGFyZHNoaXBfaW5kZXggKyAKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZ2VuZGVyKSAqIGhhcmRzaGlwX2luZGV4ICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSArIAogICAgICAgICAgICAgICAgICAgICgxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZWR1Y2F0aW9uKSArIGZhY3RvcihlbXBsb3llZCkgfCBjb3VudHJ5KSwKICAgICAgICAgICAgICAgIGRhdGEgPSBXVlNfbWl4ZWRfbW9kZWwpCgpzdW1tYXJ5KG1vZGVsXzMpCgoKCgpgYGAKCmBgYHtyfQphbm92YShtb2RlbDAsbW9kZWwxKQphbm92YShtb2RlbDEsbW9kZWxfMikKYW5vdmEobW9kZWxfMixtb2RlbF8zKSAKYGBgCgpgYGB7cn0KY29lZnNhbGxtb2RlbHM9cmJpbmQoc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzIkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzMkY29lZmZpY2llbnRzW2MoMToyLDQ6OCwzLDk6MTApLF0pCgp3cml0ZS5jc3YoY29lZnNhbGxtb2RlbHMsImNvZWZzYWxsbW9kZWxzLmNzdiIpCmBgYAoKCmBgYHtyfQojIFJlYWQgdGhlIENTViBmaWxlIGludG8gYSBkYXRhIGZyYW1lCmdiZF9tZW50YWxoZWFsdGggPC0gcmVhZF9leGNlbCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL0dCRF9tZW50YWxoZWFsdGgueGxzeCIpCgpnYmRfbWVudGFsaGVhbHRoCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApnYmRfbWVudGFsaGVhbHRoIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBnZW5kZXIsIGFnZSwgY2F1c2UsIHZhbCwgTWVhc3VyZSkKZ2JkX21lbnRhbGhlYWx0aAoKCmxpYnJhcnkoZHBseXIpCgojIEdyb3VwIGRhdGEgYnkgY291bnRyeSBhbmQgYWdlIGdyb3VwLCBhbmQgY2FsY3VsYXRlIHN1bW1hcnkgc3RhdGlzdGljcwpzdW1tYXJ5X2J5X2NvdW50cnlfYWdlIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuX0RBTFlzID0gbWVhbih2YWwpKSAgIyBDYWxjdWxhdGUgbWVhbiBvZiBEQUxZcwoKbGlicmFyeShkcGx5cikKCiMgQXNzdW1pbmcgJ3N1bW1hcnlfYnlfY291bnRyeV9hZ2UnIGNvbnRhaW5zIHlvdXIgc3VtbWFyaXplZCBkYXRhc2V0Cm1lYW5fYnlfY291bnRyeSA8LSBzdW1tYXJ5X2J5X2NvdW50cnlfYWdlICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0RBTFlzID0gbWVhbihtZWFuX0RBTFlzKSkKCiMgVmlldyB0aGUgcmVzdWx0aW5nIG1lYW4gYnkgY291bnRyeQpwcmludChtZWFuX2J5X2NvdW50cnkpCgojbG9nIHRyYW5zZm9ybQptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1sb2cobWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXMpCiAKbWVhbl9ieV9jb3VudHJ5IAoKI1JldmVyc2UgY29kaWVydW5nIAptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1zY2FsZShtZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcykKCm1lYW5fYnlfY291bnRyeQoKI3JlbmFtZSBtZWFuX0RBTFlTCm1lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVhbl9ieV9jb3VudHJ5ICU+JQogIHJlbmFtZSgnbWVudGFsX2hlYWx0aCcgPSBtZWFuX0RBTFlzKQptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCgojIyMjIyMjQW54aWV0eSBkaXNvcmRlcnMjIyMjIyMjIyMKI0ZpbHRlciBkYXRhIGZvciBhIHNwZWNpZmljIG1lbnRhbCBkaXNvcmRlciAoZS5nLiwgQW54aWV0eSBEaXNvcmRlcnMpCmFueGlldHlfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBbnhpZXR5IGRpc29yZGVycyIpICAjIENoYW5nZSAiQW54aWV0eSBEaXNvcmRlcnMiIHRvIHRoZSBkZXNpcmVkIGRpc29yZGVyCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoRGlzYWJpbGl0eS1BZGp1c3RlZCBMaWZlIFllYXJzKSBhY3Jvc3MgbG9jYXRpb25zIGFuZCBhZ2VzCm1lYW5fREFMWXMgPC0gbWVhbihhbnhpZXR5X2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGlmIHlvdSB3YW50IHRvIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnk6CmFueGlldHlfZGlzb3JkZXJzIDwtIGFueGlldHlfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0FueGlldHlfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKYW54aWV0eV9kaXNvcmRlcnMKCiNsb2cgdHJhbnNmb3JtCmFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnM9bG9nKGFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnMpCiAKYW54aWV0eV9kaXNvcmRlcnMKCiNSZXZlcnNlIGNvZGllcnVuZyAKYW54aWV0eV9kaXNvcmRlcnMkbWVhbl9BbnhpZXR5X2Rpc29yZGVycz1zY2FsZShhbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzKQphbnhpZXR5X2Rpc29yZGVycwptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmdiZF9tZW50YWxoZWFsdGgKCiMgQXNzdW1pbmcgZ2JkX21lbnRhbGhlYWx0aCBpcyB5b3VyIGRhdGEgZnJhbWUgY29udGFpbmluZyB0aGUgJ2NhdXNlJyBjb2x1bW4KCiMgR2V0IHVuaXF1ZSB2YWx1ZXMgb2YgJ2NhdXNlJyBjb2x1bW4KdW5pcXVlX2NhdXNlcyA8LSB1bmlxdWUoZ2JkX21lbnRhbGhlYWx0aCRjYXVzZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHVuaXF1ZSBjYXVzZXMKY2F1c2VfdGFibGUgPC0gZGF0YS5mcmFtZShDYXVzZSA9IHVuaXF1ZV9jYXVzZXMpCgojIFByaW50IHRoZSBjYXVzZSB0YWJsZQpwcmludChjYXVzZV90YWJsZSkKCgpgYGAKYGBge3J9CiMjIyMjIyNCdWxpbWlhIG5lcnZvc2EjIyMjIyMjIwpsaWJyYXJ5KGRwbHlyKQoKIyBGaWx0ZXIgdGhlIGRhdGEgZm9yICdCdWxpbWlhIE5lcnZvc2EnCmJ1bGltaWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQnVsaW1pYSBuZXJ2b3NhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGJ1bGltaWFfbmVydm9zYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYnVsaW1pYV9uZXJ2b3NhIDwtIGJ1bGltaWFfbmVydm9zYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9idWxpbWlhX25lcnZvc2EgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gbG9nKGJ1bGltaWFfbmVydm9zYSRtZWFuX2J1bGltaWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gc2NhbGUoYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoYnVsaW1pYV9uZXJ2b3NhKQpwcmludChhbnhpZXR5X2Rpc29yZGVycykKCmdiZF9tZW50YWxoZWFsdGgKCmBgYApgYGB7cn0KIyMjIyNBdHRlbnRpb24tZGVmaWNpdC9oeXBlcmFjdGl2aXR5IGRpc29yZGVyCmxpYnJhcnkoZHBseXIpCgoKQURIRCA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQXR0ZW50aW9uLWRlZmljaXQvaHlwZXJhY3Rpdml0eSBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihBREhEJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpBREhEIDwtIEFESEQgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fQURIRCA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCkFESEQkbWVhbl9BREhEIDwtIGxvZyhBREhEJG1lYW5fQURIRCkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpBREhEJG1lYW5fQURIRCA8LSBzY2FsZShBREhEJG1lYW5fQURIRCkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KEFESEQpCgpgYGAKYGBge3J9CiMjIyMjIyMjI0lkaW9wYXRoaWMgZGV2ZWxvcG1lbnQgaW50ZWxsZWN0dWFsIGFiaWxpdHkgCmxpYnJhcnkoZHBseXIpCgoKSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5IDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJJZGlvcGF0aGljIGRldmVsb3BtZW50YWwgaW50ZWxsZWN0dWFsIGRpc2FiaWxpdHkiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5ICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBsb2coSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JG1lYW5fSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBzY2FsZShJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCmBgYApgYGB7cn0KIyMjIyMjQW5vcmV4aWEgTmVydm9zYQoKYW5vcmV4aWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQW5vcmV4aWEgbmVydm9zYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbm9yZXhpYV9uZXJ2b3NhJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphbm9yZXhpYV9uZXJ2b3NhIDwtIGFub3JleGlhX25lcnZvc2EgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYW5vcmV4aWFfbmVydm9zYSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmFub3JleGlhX25lcnZvc2EkbWVhbl9hbm9yZXhpYV9uZXJ2b3NhIDwtIGxvZyhhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQphbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSA8LSBzY2FsZShhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFub3JleGlhX25lcnZvc2EpCmBgYApgYGB7cn0KIyMjIyNEZXByZXNzaXZlIGRpc29yZGVycyMjIyMjIyMKCmRlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJEZXByZXNzaXZlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkZXByZXNzaXZlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gZGVwcmVzc2l2ZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGxvZyhkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmRlcHJlc3NpdmVfZGlzb3JkZXJzJG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gc2NhbGUoZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGRlcHJlc3NpdmVfZGlzb3JkZXJzKQpgYGAKCmBgYHtyfQojIyMjIyMjQXV0aXNtdXMgc3BlY3RydW0gZGlzb3JkZXJzIyMjIyMjCgphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkF1dGlzbSBzcGVjdHJ1bSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBsb2coYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJG1lYW5fYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBzY2FsZShhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCmBgYAoKYGBge3J9CiMjIyMjI1NjaGl6b3BocmVuaWEjIyMjIyMjCnNjaGl6b3BocmVuaWEgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlNjaGl6b3BocmVuaWEiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oc2NoaXpvcGhyZW5pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKc2NoaXpvcGhyZW5pYSA8LSBzY2hpem9waHJlbmlhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX3NjaGl6b3BocmVuaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpzY2hpem9waHJlbmlhJG1lYW5fc2NoaXpvcGhyZW5pYSA8LSBsb2coc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEgPC0gc2NhbGUoc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChzY2hpem9waHJlbmlhKQoKYGBgCgpgYGB7cn0KIyMjIyMjI0NvbmR1Y3QgZGlzb3JkZXJzIyMjIyMjIyMjCmNvbmR1Y3RfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJDb25kdWN0IGRpc29yZGVyIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGNvbmR1Y3RfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpjb25kdWN0X2Rpc29yZGVycyA8LSBjb25kdWN0X2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9jb25kdWN0X2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPC0gbG9nKGNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKY29uZHVjdF9kaXNvcmRlcnMkbWVhbl9jb25kdWN0X2Rpc29yZGVycyA8LSBzY2FsZShjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoY29uZHVjdF9kaXNvcmRlcnMpCgoKYGBgCgpgYGB7cn0KIyMjIyMjIyNFYXRpbmcgZGlzb3JkZXJzIyMjIyMjIyMjCmVhdGluZ19kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkVhdGluZyBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oZWF0aW5nX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZWF0aW5nX2Rpc29yZGVycyA8LSBlYXRpbmdfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2VhdGluZ19kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgplYXRpbmdfZGlzb3JkZXJzJG1lYW5fZWF0aW5nX2Rpc29yZGVycyA8LSBsb2coZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMgPC0gc2NhbGUoZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChlYXRpbmdfZGlzb3JkZXJzKQoKYGBgCmBgYHtyfQojIyMjIyMjI0JpcG9sYXIgZGlzb3JkZXIjIyMjIyMjIyMKYmlwb2xhcl9kaXNvcmRlciA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQmlwb2xhciBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihiaXBvbGFyX2Rpc29yZGVyJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpiaXBvbGFyX2Rpc29yZGVyIDwtIGJpcG9sYXJfZGlzb3JkZXIgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYmlwb2xhcl9kaXNvcmRlciA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmJpcG9sYXJfZGlzb3JkZXIkbWVhbl9iaXBvbGFyX2Rpc29yZGVyIDwtIGxvZyhiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlciA8LSBzY2FsZShiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGJpcG9sYXJfZGlzb3JkZXIpCgpgYGAKYGBge3J9CnByaW50KGNhdXNlX3RhYmxlKQpgYGAKYGBge3J9CiMjIyMjIyMjU3Vic3RhbmNlIHVzZSBkaXNvcmRlcnMjIyMjIyMjIwoKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlN1YnN0YW5jZSB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gbG9nKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMkbWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzY2FsZShzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgpgYGAKYGBge3J9CiMjIyNEcnVnIHVzZSBkaXNvcmRlcnMKCmRydWdfdXNlX2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHJ1ZyB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGRydWdfdXNlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHJ1Z191c2VfZGlzb3JkZXJzIDwtIGRydWdfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gbG9nKGRydWdfdXNlX2Rpc29yZGVycyRtZWFuX2RydWdfdXNlX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gc2NhbGUoZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHJ1Z191c2VfZGlzb3JkZXJzKQoKCmBgYApgYGB7cn0KIyMjIyMjIyMjI0FsY29ob2wgdXNlIGRpc29yZGVycwphbGNvaG9sX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkFsY29ob2wgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmFsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBhbGNvaG9sX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIGxvZyhhbGNvaG9sX3VzZV9kaXNvcmRlcnMkbWVhbl9hbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIHNjYWxlKGFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFsY29ob2xfdXNlX2Rpc29yZGVycykKCmBgYApgYGB7cn0KIyMjIyMjI01ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXJzCm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIk1ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgptYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyJG1lYW5fbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBsb2cobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gc2NhbGUobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKYGBgCmBgYHtyfQojIyMjIyMjRHlzdGh5bWlhIyMjIyMjIyMKCmR5c3RoeW1pYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHlzdGh5bWlhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGR5c3RoeW1pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHlzdGh5bWlhIDwtIGR5c3RoeW1pYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9keXN0aHltaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gbG9nKGR5c3RoeW1pYSRtZWFuX2R5c3RoeW1pYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gc2NhbGUoZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHlzdGh5bWlhKQoKCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKCiMgUGVyZm9ybSBsZWZ0IGpvaW5zIGZvciBlYWNoIGRhdGEgZnJhbWUgb24gJ2NvdW50cnknCmZpbmFsX21lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVudGFsX2hlYWx0aF9pbmRleCAlPiUKICBsZWZ0X2pvaW4oYnVsaW1pYV9uZXJ2b3NhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKEFESEQsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5LCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGFub3JleGlhX25lcnZvc2EsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZGVwcmVzc2l2ZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGNvbmR1Y3RfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKHNjaGl6b3BocmVuaWEsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZWF0aW5nX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihiaXBvbGFyX2Rpc29yZGVyLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGRydWdfdXNlX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihkeXN0aHltaWEsIGJ5ID0gImNvdW50cnkiKQoKIyBEaXNwbGF5IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKIyBTaG93IHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKaGVhZChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKYGBgCmBgYHtyfQppbmRpY2F0b3JzIDwtIGxlZnRfam9pbihmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4LCBoYXJkc2hpcCwgYnkgPSAiY291bnRyeSIpCmluZGljYXRvcnMKaGVhZChpbmRpY2F0b3JzKQoKbmV3X2RhdGEgPC0gbGVmdF9qb2luIChXVlNfZGF0YSwgaW5kaWNhdG9ycywgYnkgPSAiY291bnRyeSIpCm5ld19kYXRhCgoKIyBUcmFuc2Zyb20gcmlzayBpdGVtIHN1Y2ggdGhhdCBoaWdoIHZhbHVlcyByZXByZXNlbnQgbW9yZSByaXNrIHRha2luZwpuZXdfZGF0YSRyaXNrdGFraW5nID0gNiAtIG5ld19kYXRhJHJpc2t0YWtpbmcgKyAxCgogIAojIFRyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gVC1zY29yZSAobWVhbiA9IDUwLCBzZCA9IDEwKQpuZXdfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgPSAxMCpzY2FsZShuZXdfZGF0YSRyaXNrdGFraW5nLCBjZW50ZXI9VFJVRSxzY2FsZT1UUlVFKSs1MAoKbmV3X2RhdGEKCiNUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFogc2NvcmUgCgojIEFzc3VtaW5nIFQtc2NvcmVzIGhhdmUgYSBtZWFuIG9mIDUwIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxMApuZXdfZGF0YSRaX3Njb3JlX3Jpc2t0YWtpbmcgPSAobmV3X2RhdGEkVF9zY29yZV9yaXNrdGFraW5nIC0gNTApIC8gMTAKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KG5ld19kYXRhKQoKbmV3X2RhdGEgPC0gbmV3X2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHpfc2NvcmVfYWdlID0gc2NhbGUoYWdlKSkKbmV3X2RhdGEKYGBgCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCgpsaWJyYXJ5KGxtZTQpCgptb2RlbCA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKHpfc2NvcmVfYWdlKSAqIG1lbnRhbF9oZWFsdGggKwogICAgICAgICAgICAgICBnZW5kZXIgKiBtZW50YWxfaGVhbHRoICsKICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArCiAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSArCiAgICAgICAgICAgICAgICgxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpIHwgY291bnRyeSksCiAgICAgICAgICAgICBkYXRhID0gbmV3X2RhdGEpCgoKc3VtbWFyeShtb2RlbCkKCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyBhIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVsIChsbWVyKSwgYW5kIHlvdSB3YW50IHRvIHNhdmUgY29lZmZpY2llbnRzIHRvIGEgQ1NWIGZpbGUKCiMgRXh0cmFjdCBjb2VmZmljaWVudHMgZnJvbSB0aGUgbW9kZWwgc3VtbWFyeQpjb2VmZmljaWVudHNfZGYgPC0gZGF0YS5mcmFtZShzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHMpCgojIFdyaXRlIGNvZWZmaWNpZW50cyB0byBhIENTViBmaWxlCndyaXRlLmNzdihjb2VmZmljaWVudHNfZGYsICJtb2RlbF9jb2VmZmljaWVudHMuY3N2Iiwgcm93Lm5hbWVzID0gVFJVRSkKCmBgYAoKCmBgYAoKCgo=
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkobWFwcykKbGlicmFyeShoYXZlbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCmhhcmRzaGlwX2NvbXBsZXRlIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9jb2RlL0hhcmRzaGlwX2NvbXBsZXRlXzIwMjQueGxzeCIpCmhhcmRzaGlwX2NvbXBsZXRlCgoKYGBgCmBgYHtyfQpoYXJkc2hpcF9jb21wbGV0ZSRob21pY2lkZXJhdGU9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZSkKaGFyZHNoaXBfY29tcGxldGUkZ2RwPWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRnZHApCmhhcmRzaGlwX2NvbXBsZXRlJGluZmFudG1vcnRhbGl0eT1sb2coaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5KQpoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeT1sb2coaGFyZHNoaXBfY29tcGxldGUkbGlmZWV4cGVjdGFuY3kpCgpoYXJkc2hpcF9jb21wbGV0ZQoKIyBSZXZlcnNlIENvZGllcnVuZwpoYXJkc2hpcF9jb21wbGV0ZSRob21pY2lkZXJhdGU9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlKQpoYXJkc2hpcF9jb21wbGV0ZSRnZHA9c2NhbGUoLWhhcmRzaGlwX2NvbXBsZXRlJGdkcCkKaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5PXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJGluZmFudG1vcnRhbGl0eSkKaGFyZHNoaXBfY29tcGxldGUkbGlmZWV4cGVjdGFuY3k9c2NhbGUoLWhhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5KQpoYXJkc2hpcF9jb21wbGV0ZSRnaW5pPXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJGdpbmkpCmhhcmRzaGlwX2NvbXBsZXRlJGZlbWFsZW1hbGVfcHJpbWVkdT1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkZmVtYWxlbWFsZV9wcmltZWR1KQpoYXJkc2hpcF9jb21wbGV0ZQoKaGFyZHNoaXBfY29tcGxldGUkaGFyZHNoaXBfaW5kZXg9KGhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZStoYXJkc2hpcF9jb21wbGV0ZSRnZHAraGFyZHNoaXBfY29tcGxldGUkZ2luaStoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeStoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHkraGFyZHNoaXBfY29tcGxldGUkZmVtYWxlbWFsZV9wcmltZWR1KS82CgpoYXJkc2hpcF9jb21wbGV0ZQoKIyBMYXVyYSBhZGRlZCB0aGlzIGNvZGUKbGlicmFyeShkcGx5cikKCiMgSW1wdXRlIG1pc3NpbmcgdmFsdWVzIGluIHRoZSBoYXJkc2hpcCBpbmRpY2F0b3JzIHVzaW5nIHRoZSBtZWRpYW4KaGFyZHNoaXBfY29tcGxldGUgPC0gaGFyZHNoaXBfY29tcGxldGUgJT4lCiAgbXV0YXRlKGFjcm9zcyhjKCJob21pY2lkZXJhdGUiLCAiZ2RwIiwgImluZmFudG1vcnRhbGl0eSIsICJsaWZlZXhwZWN0YW5jeSIsICJnaW5pIiwgImZlbWFsZW1hbGVfcHJpbWVkdSIpLAogICAgICAgICAgICAgICAgfmlmZWxzZShpcy5uYSguKSwgbWVkaWFuKC4sIG5hLnJtID0gVFJVRSksIC4pKSkKCmhhcmRzaGlwX2NvbXBsZXRlCgojIFVzZSB0aGUgbXV0YXRlIGZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgY291bnRyeSBuYW1lCmhhcmRzaGlwX2NvbXBsZXRlIDwtIGhhcmRzaGlwX2NvbXBsZXRlICU+JQogIG11dGF0ZShjb3VudHJ5ID0gaWZlbHNlKGxhYmVsID09ICJTZXJiaWEgYW5kIE1vbnRlbmVncm8iLCAiU2VyYmlhIiwgbGFiZWwpKQpoYXJkc2hpcF9jb21wbGV0ZQpgYGAKCgpgYGB7cn0KIyBEYXRhIG9mIFdhdmUgNQoKCldWNV9kYXRhIDwtIHJlYWRSRFMoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9GMDAwMDc5NDQtV1Y1X0RhdGFfUl92MjAxODA5MTIucmRzIikKCgojIENvbnZlcnQgV1Y1X2RhdGEtb2JqZWN0IGluIGRhdGEuZnJhbWUgCldWNV9kYXRhX2RmIDwtIGFzLmRhdGEuZnJhbWUoV1Y1X2RhdGEpCgojIHNob3cgZmlyc3QgZml2ZSBjb2x1bW5zCldWNV9kYXRhX2RmCmBgYAoKCgpgYGB7cn0KI3JlbmFtZSB0aGUgdmFyaWFibGVzCldWNV9kYXRhIDwtIFdWNV9kYXRhX2RmICU+JQogIHJlbmFtZShnZW5kZXIgPSBWMjM1LCBhZ2UgPSBWMjM3LCBjb3VudHJ5X2NvZGUgPSBWMiwgd2F2ZSA9IFYxLCByaXNrdGFraW5nID0gVjg2LCBjaGlsZHJlbiA9IFY1NiwgbWFycmllZCA9IFY1NSwgZW1wbG95ZWQgPSBWMjQxLCBlZHVjYXRpb24gPSBWMjM4KQpXVjVfZGF0YQoKY29sbmFtZXMoV1Y1X2RhdGEpCgoKCiNzZWxlY3Qgb25seSB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0CldWNV9kYXRhIDwtIFdWNV9kYXRhICU+JQogIGRwbHlyOjpzZWxlY3QoZ2VuZGVyLCBhZ2UsIGNvdW50cnlfY29kZSwgd2F2ZSwgcmlza3Rha2luZywgY2hpbGRyZW4sIG1hcnJpZWQsIGVtcGxveWVkLCBlZHVjYXRpb24pCldWNV9kYXRhCmBgYApgYGB7cn0KIyBSZWFkIGNvdW50cnluYW1lcyBkYXRhIGZyb20gdGhlIENTViBmaWxlICh0byBkZWNvZGUgdGhlIGRhdGFzZXQgNSkKY291bnRyeW5hbWVzIDwtIHJlYWQuY3N2KCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlciA9IEZBTFNFLCBhcy5pcyA9IFRSVUUpCmNvbG5hbWVzKGNvdW50cnluYW1lcykgPC0gYygiY29kZSIsICJuYW1lIikKCiMgQXNzdW1pbmcgV1Y1X2RhdGEgaGFzIGEgY29sdW1uIG5hbWVkIGNvdW50cnlfY29kZQpXVjVfZGF0YSRjb3VudHJ5IDwtIGNvdW50cnluYW1lcyRuYW1lW21hdGNoKFdWNV9kYXRhJGNvdW50cnlfY29kZSwgY291bnRyeW5hbWVzJGNvZGUpXQoKIyBDaGVjayB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggY291bnRyeSBpbiB0aGUgbmV3IGNvbHVtbgp0YWJsZShXVjVfZGF0YSRjb3VudHJ5KQoKIyBEaXNwbGF5IHRoZSB1cGRhdGVkIFdWNV9kYXRhCnByaW50KFdWNV9kYXRhKQpgYGAKYGBge3J9CiNSZWFkIERhdGFzZXQgKFdhdmUgNikKCldWNl9kYXRhIDwtIGxvYWQoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9XVjZfRGF0YV9SX3YyMDIwMTExNy5yZGF0YSIpIApXVjZfZGF0YSA8LSBXVjZfRGF0YV9SX3YyMDIwMTExNyAKcHJpbnQoV1Y2X2RhdGEpCmBgYAoKYGBge3J9CldWNl9kYXRhIDwtIFdWNl9kYXRhICU+JQogIHJlbmFtZSh3YXZlID0gVjEsIGdlbmRlciA9IFYyNDAsIGFnZSA9IFYyNDIsY291bnRyeV9jb2RlID0gVjIsIHJpc2t0YWtpbmcgPSBWNzYsIGNoaWxkcmVuID0gVjU4LCBtYXJyaWVkID0gVjU3LCBlbXBsb3llZCA9IFYyMjksIGVkdWNhdGlvbiA9IFYyNDgpCgoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKCldWNl9kYXRhIDwtIFdWNl9kYXRhICU+JQogIGRwbHlyOjpzZWxlY3Qod2F2ZSwgZ2VuZGVyLCBhZ2UsIGNvdW50cnlfY29kZSxyaXNrdGFraW5nLCBjaGlsZHJlbiwgbWFycmllZCwgZW1wbG95ZWQsIGVkdWNhdGlvbikKV1Y2X2RhdGEKYGBgCmBgYHtyfQpjb3VudHJ5bmFtZXMgPSByZWFkLmNzdigiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL2NvdW50cnluYW1lcy50eHQiLCBoZWFkZXI9RkFMU0UsYXMuaXM9VFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA9IGMoImNvZGUiLCAibmFtZSIpCldWNl9kYXRhJGNvdW50cnkgPSBjb3VudHJ5bmFtZXMkbmFtZSBbbWF0Y2goV1Y2X2RhdGEkY291bnRyeV9jb2RlLCBjb3VudHJ5bmFtZXMkY29kZSldCnRhYmxlKFdWNl9kYXRhJGNvdW50cnkpCldWNl9kYXRhCmBgYApgYGB7cn0KCldWU19kYXRhID0gcmJpbmQoV1Y1X2RhdGEsIFdWNl9kYXRhKQpXVlNfZGF0YQoKY291bnRyeV9jb3VudHMgPC0gV1ZTX2RhdGEgJT4lCiAgY291bnQoY291bnRyeSkKCiMgUHJpbnQgdGhlIHJlc3VsdApwcmludChjb3VudHJ5X2NvdW50cykKCgoKCgoKCgoKCmBgYApgYGB7cn0KCgoKCldWU19kYXRhID0gc3Vic2V0KFdWU19kYXRhLCByaXNrdGFraW5nID4gMCAmIGdlbmRlciA+IDAgJiBhZ2UgPjAgJiBlZHVjYXRpb24gPiAwICYgZW1wbG95ZWQgPiAwICYgbWFycmllZCA+IDAgJiBjaGlsZHJlbiA+PSAwKQpkYXRhX1dhdmU1ID0gc3Vic2V0KFdWNV9kYXRhLCByaXNrdGFraW5nID4gMCAmIGdlbmRlciA+IDAgJiBhZ2UgPjAgJiBlZHVjYXRpb24gPiAwICYgZW1wbG95ZWQgPiAwICYgbWFycmllZCA+IDAgJiBjaGlsZHJlbiA+PSAwKQpkYXRhX1dhdmU2ID0gc3Vic2V0KFdWNl9kYXRhLCByaXNrdGFraW5nID4gMCAmIGdlbmRlciA+IDAgJiBhZ2UgPjAgJiBlZHVjYXRpb24gPiAwICYgZW1wbG95ZWQgPiAwICYgbWFycmllZCA+IDAgJiBjaGlsZHJlbiA+PSAwKQpXVlNfZGF0YSA8LSBuYS5vbWl0KFdWU19kYXRhKQpkYXRhX1dhdmU1IDwtIG5hLm9taXQoZGF0YV9XYXZlNSkKZGF0YV9XYXZlNiA8LSBuYS5vbWl0KGRhdGFfV2F2ZTYpCgoKCgoKCgoKCiMgVXNlIHRoZSBtdXRhdGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjb3VudHJ5IG5hbWUKV1ZTX2RhdGEgPC0gV1ZTX2RhdGEgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UoY291bnRyeSA9PSAiR3JlYXQgQnJpdGFpbiIsICJVbml0ZWQgS2luZ2RvbSIsIGNvdW50cnkpKQpgYGAKYGBge3J9CiMgVHJhbnNmcm9tIHJpc2sgaXRlbSBzdWNoIHRoYXQgaGlnaCB2YWx1ZXMgcmVwcmVzZW50IG1vcmUgcmlzayB0YWtpbmcKV1ZTX2RhdGEkcmlza3Rha2luZyA9IDYgLSBXVlNfZGF0YSRyaXNrdGFraW5nICsgMQoKICAKIyBUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFQtc2NvcmUgKG1lYW4gPSA1MCwgc2QgPSAxMCkKV1ZTX2RhdGEkVF9zY29yZV9yaXNrdGFraW5nID0gMTAqc2NhbGUoV1ZTX2RhdGEkcmlza3Rha2luZywgY2VudGVyPVRSVUUsc2NhbGU9VFJVRSkrNTAKCldWU19kYXRhCgojVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBaIHNjb3JlIAoKIyBBc3N1bWluZyBULXNjb3JlcyBoYXZlIGEgbWVhbiBvZiA1MCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMTAKV1ZTX2RhdGEkWl9zY29yZV9yaXNrdGFraW5nID0gKFdWU19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyAtIDUwKSAvIDEwCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChXVlNfZGF0YSkKCldWU19kYXRhIDwtIFdWU19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCldWU19kYXRhCgpjb3VudHJ5X2NvdW50cyA8LSBXVlNfZGF0YSAlPiUKICBjb3VudChjb3VudHJ5KQoKIyBQcmludCB0aGUgcmVzdWx0CnByaW50KGNvdW50cnlfY291bnRzKQoKCgoKYGBgCgpgYGB7cn0KCldWU19kYXRhJGdlbmRlciA9IGlmZWxzZShXVlNfZGF0YSRnZW5kZXIgPT0gMSwgMCwgMSkgIyBzZXg6IG1hbGUgdnMuIGZlbWFsZQpXVlNfZGF0YSRjaGlsZHJlbiA9IGlmZWxzZShXVlNfZGF0YSRjaGlsZHJlbiA9PSAwLCAwLCAxKSAjIGNoaWxkcmVuOiBubyB2cy4geWVzCldWU19kYXRhJG1hcnJpZWQgPSBpZmVsc2UoV1ZTX2RhdGEkbWFycmllZCA9PSAxLCAxLCAwKSAjIG1hcnJpZWQ6IHllcyB2cy4gbm8KV1ZTX2RhdGEkZW1wbG95ZWQgPSBpZmVsc2UoV1ZTX2RhdGEkZW1wbG95ZWQgPCA0LCAxLCAwKSAjIGVtcGxveWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVkdWNhdGlvbiA9IGlmZWxzZShXVlNfZGF0YSRlZHVjYXRpb24gPCA0LCAwLCAxKSAjIGVkdWNhdGlvbjogbm8gcHJpbWFyeSB2cy4gcHJpbWFyeSsgCgoKaGFyZHNoaXAgPC0gaGFyZHNoaXBfY29tcGxldGUgJT4lCiAgZHBseXI6OnNlbGVjdChsYWJlbCwgY29kZSwgaGFyZHNoaXBfaW5kZXgpCmhhcmRzaGlwCgoKCgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmhhcmRzaGlwIDwtIHJlbmFtZShoYXJkc2hpcCwgY291bnRyeSA9IGxhYmVsKQoKV1ZTX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihXVlNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpXVlNfbWl4ZWRfbW9kZWwKaGVhZChXVlNfbWl4ZWRfbW9kZWwpCgpjb2xuYW1lcyhXVlNfZGF0YSkKY29sbmFtZXMoaGFyZHNoaXApCgp1bmlxdWUoV1ZTX2RhdGEkY291bnRyeSkKCldWU19taXhlZF9tb2RlbAoKdW5pcXVlKFdWU19taXhlZF9tb2RlbCRjb3VudHJ5KQpgYGAKYGBge3J9CmxpYnJhcnkobG1lclRlc3QpCgojIGludGVyY2VwdCBvbmx5IG1vZGVsCm1vZGVsMCA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArICgxfGNvdW50cnkpLGRhdGEgPSBXVlNfZGF0YSkKc3VtbWFyeV9tb2RlbDA9c3VtbWFyeShtb2RlbDApCnN1bW1hcnlfbW9kZWwwCmBgYApgYGB7cn0KIyBhZ2UsIHNleCAKbW9kZWwxID0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICtzY2FsZShhZ2UpK2ZhY3RvcihnZW5kZXIpICsgKDErc2NhbGUoYWdlKStmYWN0b3IoZ2VuZGVyKXxjb3VudHJ5KSxkYXRhID0gV1ZTX21peGVkX21vZGVsLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQpzdW1tYXJ5X21vZGVsMT1zdW1tYXJ5KG1vZGVsMSkKc3VtbWFyeV9tb2RlbDEKYGBgCgpgYGB7cn0KI21vZGVsIDIKbGlicmFyeShsbWU0KQoKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQoKIyBEZWZpbmUgdGhlIGxtZXIgbW9kZWwgYW5kIGFzc2lnbiBpdCB0byAnbW9kZWxfMicKbW9kZWxfMiA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgCiAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpICsKICAgICAgICAgICAgICAgICAoMSArIHNjYWxlKGFnZSkgKyBmYWN0b3IoZ2VuZGVyKSArIGZhY3RvcihjaGlsZHJlbikgKyBmYWN0b3IoZW1wbG95ZWQpICsKICAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMCkpKQoKCiMgRGlzcGxheSB0aGUgc3VtbWFyeSBvZiB0aGUgbW9kZWwKc3VtbWFyeV9tb2RlbF8yID0gc3VtbWFyeShtb2RlbF8yKQpzdW1tYXJ5X21vZGVsXzIKCldWU19taXhlZF9tb2RlbAoKCmBgYAoKCmBgYHtyfQptb2RlbF8zIDwtIGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArIHNjYWxlKGFnZSkgKiBoYXJkc2hpcF9pbmRleCArIAogICAgICAgICAgICAgICAgICAgIGZhY3RvcihnZW5kZXIpICogaGFyZHNoaXBfaW5kZXggKyBmYWN0b3IobWFycmllZCkgKyBmYWN0b3IoY2hpbGRyZW4pICsgCiAgICAgICAgICAgICAgICAgICAgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpICsgCiAgICAgICAgICAgICAgICAgICAgKDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZWR1Y2F0aW9uKSArIGZhY3RvcihlbXBsb3llZCkgfCBjb3VudHJ5KSwKICAgICAgICAgICAgICAgIGRhdGEgPSBXVlNfbWl4ZWRfbW9kZWwsY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDApKSkKCnN1bW1hcnlfbW9kZWxfMyA9IHN1bW1hcnkobW9kZWxfMykgCgpzdW1tYXJ5X21vZGVsXzMKCgpgYGAKCmBgYHtyfQojIERlZmluZSBhbm92YV9yZXN1bHRzIGxpc3Qgd2l0aCBtdWx0aXBsZSBhbm92YSgpIGNhbGxzCmFub3ZhX3Jlc3VsdHMgPC0gbGlzdCgKICBhbm92YShtb2RlbDAsIG1vZGVsMSksCiAgYW5vdmEobW9kZWwxLCBtb2RlbF8yKSwKICBhbm92YShtb2RlbF8yLCBtb2RlbF8zKQopCgphbm92YV9yZXN1bHRzCgpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KHRpYmJsZSkKCgoKbGlicmFyeShkcGx5cikKIyBGb3JtYXQgQU5PVkEgcmVzdWx0cyBpbnRvIGEgdGlkeSBkYXRhIGZyYW1lCmFub3ZhX3N1bW1hcnkgPC0gYmluZF9yb3dzKGxhcHBseShhbm92YV9yZXN1bHRzLCB0aWR5KSwgLmlkID0gIkNvbXBhcmlzb24iKQoKIyBQcmludCB0aGUgc3VtbWFyeSB0YWJsZQpwcmludChhbm92YV9zdW1tYXJ5KQoKYGBgCmBgYHtyfQojIEV4dHJhY3QgcmFuZG9tIGVmZmVjdHMgZm9yICdjb3VudHJ5JwojIEFzc3VtaW5nICdtb2RlbCcgaXMgeW91ciBmaXR0ZWQgbG1lciBtb2RlbApyYW5kb21fZWZmZWN0cyA8LSByYW5lZihtb2RlbF8yKQpyYW5kb21fZWZmZWN0cwoKCgoKCgpgYGAKYGBge3J9CnJlZ3Jlc3Npb25fcmVzdWx0c19XVlMgPC0gV1ZTX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgZG8obW9kZWwgPSBsbShaX3Njb3JlX3Jpc2t0YWtpbmcgfiBzY2FsZShhZ2UpICsgZ2VuZGVyLCBkYXRhID0gLikpICU+JQogIHN1bW1hcml6ZSgKICAgIGNvdW50cnkgPSBmaXJzdChjb3VudHJ5KSwKICAgIGludGVyY2VwdF9yZWdyZXNzaW9uID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMSwgMV0sCiAgICBzbG9wZV9hZ2VfcmVncmVzc2lvbiA9IGNvZWYoc3VtbWFyeShtb2RlbCkpWzIsIDFdLAogICAgc2xvcGVfZ2VuZGVyX3JlZ3Jlc3Npb24gPSBjb2VmKHN1bW1hcnkobW9kZWwpKVszLCAxXQogICkKCnJlZ3Jlc3Npb25fcmVzdWx0c19XVlMKCnJhbmRvbV9lZmZlY3RzIDwtIHJhbmVmKG1vZGVsXzIpCnJhbmRvbV9lZmZlY3RzCgpjb2xuYW1lcyhyYW5kb21fZWZmZWN0cykKCgoKCgoKCgoKCgoKCgoKCmBgYAoKYGBge3J9CmNvZWZzYWxsbW9kZWxzPXJiaW5kKHN1bW1hcnlfbW9kZWwxJGNvZWZmaWNpZW50cywKc3VtbWFyeV9tb2RlbF8yJGNvZWZmaWNpZW50cywKc3VtbWFyeV9tb2RlbF8zJGNvZWZmaWNpZW50c1tjKDE6Miw0OjgsMyw5OjEwKSxdKQoKd3JpdGUuY3N2KGNvZWZzYWxsbW9kZWxzLCJjb2Vmc2FsbG1vZGVscy5jc3YiKQpgYGAKCgpgYGB7cn0KIyBSZWFkIHRoZSBDU1YgZmlsZSBpbnRvIGEgZGF0YSBmcmFtZQpnYmRfbWVudGFsaGVhbHRoIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9HQkRfbWVudGFsaGVhbHRoLnhsc3giKQoKZ2JkX21lbnRhbGhlYWx0aAoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKZ2JkX21lbnRhbGhlYWx0aCA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgZ2VuZGVyLCBhZ2UsIGNhdXNlLCB2YWwsIE1lYXN1cmUpCmdiZF9tZW50YWxoZWFsdGgKCgpsaWJyYXJ5KGRwbHlyKQoKIyBHcm91cCBkYXRhIGJ5IGNvdW50cnkgYW5kIGFnZSBncm91cCwgYW5kIGNhbGN1bGF0ZSBzdW1tYXJ5IHN0YXRpc3RpY3MKc3VtbWFyeV9ieV9jb3VudHJ5X2FnZSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGdyb3VwX2J5KGNvdW50cnksIGFnZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgbWVhbl9EQUxZcyA9IG1lYW4odmFsKSkgICMgQ2FsY3VsYXRlIG1lYW4gb2YgREFMWXMKCmxpYnJhcnkoZHBseXIpCgojIEFzc3VtaW5nICdzdW1tYXJ5X2J5X2NvdW50cnlfYWdlJyBjb250YWlucyB5b3VyIHN1bW1hcml6ZWQgZGF0YXNldAptZWFuX2J5X2NvdW50cnkgPC0gc3VtbWFyeV9ieV9jb3VudHJ5X2FnZSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9EQUxZcyA9IG1lYW4obWVhbl9EQUxZcykpCgojIFZpZXcgdGhlIHJlc3VsdGluZyBtZWFuIGJ5IGNvdW50cnkKcHJpbnQobWVhbl9ieV9jb3VudHJ5KQoKI2xvZyB0cmFuc2Zvcm0KbWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXM9bG9nKG1lYW5fYnlfY291bnRyeSRtZWFuX0RBTFlzKQogCm1lYW5fYnlfY291bnRyeSAKCiNSZXZlcnNlIGNvZGllcnVuZyAKbWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXM9c2NhbGUobWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXMpCgptZWFuX2J5X2NvdW50cnkKCiNyZW5hbWUgbWVhbl9EQUxZUwptZW50YWxfaGVhbHRoX2luZGV4IDwtIG1lYW5fYnlfY291bnRyeSAlPiUKICByZW5hbWUoJ21lbnRhbF9oZWFsdGgnID0gbWVhbl9EQUxZcykKbWVudGFsX2hlYWx0aF9pbmRleAoKYGBgCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKIyMjIyMjI0FueGlldHkgZGlzb3JkZXJzIyMjIyMjIyMjCiNGaWx0ZXIgZGF0YSBmb3IgYSBzcGVjaWZpYyBtZW50YWwgZGlzb3JkZXIgKGUuZy4sIEFueGlldHkgRGlzb3JkZXJzKQphbnhpZXR5X2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQW54aWV0eSBkaXNvcmRlcnMiKSAgIyBDaGFuZ2UgIkFueGlldHkgRGlzb3JkZXJzIiB0byB0aGUgZGVzaXJlZCBkaXNvcmRlcgoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERpc2FiaWxpdHktQWRqdXN0ZWQgTGlmZSBZZWFycykgYWNyb3NzIGxvY2F0aW9ucyBhbmQgYWdlcwptZWFuX0RBTFlzIDwtIG1lYW4oYW54aWV0eV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBpZiB5b3Ugd2FudCB0byBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5OgphbnhpZXR5X2Rpc29yZGVycyA8LSBhbnhpZXR5X2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9BbnhpZXR5X2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCmFueGlldHlfZGlzb3JkZXJzCgojbG9nIHRyYW5zZm9ybQphbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzPWxvZyhhbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzKQogCmFueGlldHlfZGlzb3JkZXJzCgojUmV2ZXJzZSBjb2RpZXJ1bmcgCmFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnM9c2NhbGUoYW54aWV0eV9kaXNvcmRlcnMkbWVhbl9BbnhpZXR5X2Rpc29yZGVycykKYW54aWV0eV9kaXNvcmRlcnMKbWVudGFsX2hlYWx0aF9pbmRleAoKYGBgCmBgYHtyfQpnYmRfbWVudGFsaGVhbHRoCgojIEFzc3VtaW5nIGdiZF9tZW50YWxoZWFsdGggaXMgeW91ciBkYXRhIGZyYW1lIGNvbnRhaW5pbmcgdGhlICdjYXVzZScgY29sdW1uCgojIEdldCB1bmlxdWUgdmFsdWVzIG9mICdjYXVzZScgY29sdW1uCnVuaXF1ZV9jYXVzZXMgPC0gdW5pcXVlKGdiZF9tZW50YWxoZWFsdGgkY2F1c2UpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCB1bmlxdWUgY2F1c2VzCmNhdXNlX3RhYmxlIDwtIGRhdGEuZnJhbWUoQ2F1c2UgPSB1bmlxdWVfY2F1c2VzKQoKIyBQcmludCB0aGUgY2F1c2UgdGFibGUKcHJpbnQoY2F1c2VfdGFibGUpCgoKYGBgCmBgYHtyfQojIyMjIyMjQnVsaW1pYSBuZXJ2b3NhIyMjIyMjIyMKbGlicmFyeShkcGx5cikKCiMgRmlsdGVyIHRoZSBkYXRhIGZvciAnQnVsaW1pYSBOZXJ2b3NhJwpidWxpbWlhX25lcnZvc2EgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkJ1bGltaWEgbmVydm9zYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihidWxpbWlhX25lcnZvc2EkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmJ1bGltaWFfbmVydm9zYSA8LSBidWxpbWlhX25lcnZvc2EgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYnVsaW1pYV9uZXJ2b3NhID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhIDwtIGxvZyhidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhIDwtIHNjYWxlKGJ1bGltaWFfbmVydm9zYSRtZWFuX2J1bGltaWFfbmVydm9zYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGJ1bGltaWFfbmVydm9zYSkKcHJpbnQoYW54aWV0eV9kaXNvcmRlcnMpCgpnYmRfbWVudGFsaGVhbHRoCgpgYGAKYGBge3J9CiMjIyMjQXR0ZW50aW9uLWRlZmljaXQvaHlwZXJhY3Rpdml0eSBkaXNvcmRlcgpsaWJyYXJ5KGRwbHlyKQoKCkFESEQgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkF0dGVudGlvbi1kZWZpY2l0L2h5cGVyYWN0aXZpdHkgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oQURIRCR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKQURIRCA8LSBBREhEICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0FESEQgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpBREhEJG1lYW5fQURIRCA8LSBsb2coQURIRCRtZWFuX0FESEQpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKQURIRCRtZWFuX0FESEQgPC0gc2NhbGUoQURIRCRtZWFuX0FESEQpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChBREhEKQoKYGBgCmBgYHtyfQojIyMjIyMjIyNJZGlvcGF0aGljIGRldmVsb3BtZW50IGludGVsbGVjdHVhbCBhYmlsaXR5IApsaWJyYXJ5KGRwbHlyKQoKCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiSWRpb3BhdGhpYyBkZXZlbG9wbWVudGFsIGludGVsbGVjdHVhbCBkaXNhYmlsaXR5IikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5IDwtIElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gbG9nKElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gc2NhbGUoSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JG1lYW5fSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQpgYGAKYGBge3J9CiMjIyMjI0Fub3JleGlhIE5lcnZvc2EKCmFub3JleGlhX25lcnZvc2EgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkFub3JleGlhIG5lcnZvc2EiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYW5vcmV4aWFfbmVydm9zYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYW5vcmV4aWFfbmVydm9zYSA8LSBhbm9yZXhpYV9uZXJ2b3NhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2Fub3JleGlhX25lcnZvc2EgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgphbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSA8LSBsb2coYW5vcmV4aWFfbmVydm9zYSRtZWFuX2Fub3JleGlhX25lcnZvc2EpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYW5vcmV4aWFfbmVydm9zYSRtZWFuX2Fub3JleGlhX25lcnZvc2EgPC0gc2NhbGUoYW5vcmV4aWFfbmVydm9zYSRtZWFuX2Fub3JleGlhX25lcnZvc2EpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhbm9yZXhpYV9uZXJ2b3NhKQpgYGAKYGBge3J9CiMjIyMjRGVwcmVzc2l2ZSBkaXNvcmRlcnMjIyMjIyMjCgpkZXByZXNzaXZlX2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRGVwcmVzc2l2ZSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oZGVwcmVzc2l2ZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmRlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGRlcHJlc3NpdmVfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycyA8LSBsb2coZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIHNjYWxlKGRlcHJlc3NpdmVfZGlzb3JkZXJzJG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChkZXByZXNzaXZlX2Rpc29yZGVycykKYGBgCgpgYGB7cn0KIyMjIyMjI0F1dGlzbXVzIHNwZWN0cnVtIGRpc29yZGVycyMjIyMjIwoKYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBdXRpc20gc3BlY3RydW0gZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzIDwtIGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gbG9nKGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gc2NhbGUoYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJG1lYW5fYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQpgYGAKCmBgYHtyfQojIyMjIyNTY2hpem9waHJlbmlhIyMjIyMjIwpzY2hpem9waHJlbmlhIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJTY2hpem9waHJlbmlhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKHNjaGl6b3BocmVuaWEkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CnNjaGl6b3BocmVuaWEgPC0gc2NoaXpvcGhyZW5pYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9zY2hpem9waHJlbmlhID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4Kc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEgPC0gbG9nKHNjaGl6b3BocmVuaWEkbWVhbl9zY2hpem9waHJlbmlhKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCnNjaGl6b3BocmVuaWEkbWVhbl9zY2hpem9waHJlbmlhIDwtIHNjYWxlKHNjaGl6b3BocmVuaWEkbWVhbl9zY2hpem9waHJlbmlhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoc2NoaXpvcGhyZW5pYSkKCmBgYAoKYGBge3J9CiMjIyMjIyNDb25kdWN0IGRpc29yZGVycyMjIyMjIyMjIwpjb25kdWN0X2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQ29uZHVjdCBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihjb25kdWN0X2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKY29uZHVjdF9kaXNvcmRlcnMgPC0gY29uZHVjdF9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzIDwtIGxvZyhjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPC0gc2NhbGUoY29uZHVjdF9kaXNvcmRlcnMkbWVhbl9jb25kdWN0X2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGNvbmR1Y3RfZGlzb3JkZXJzKQoKCmBgYAoKYGBge3J9CiMjIyMjIyMjRWF0aW5nIGRpc29yZGVycyMjIyMjIyMjIwplYXRpbmdfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJFYXRpbmcgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGVhdGluZ19kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmVhdGluZ19kaXNvcmRlcnMgPC0gZWF0aW5nX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9lYXRpbmdfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMgPC0gbG9nKGVhdGluZ19kaXNvcmRlcnMkbWVhbl9lYXRpbmdfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmVhdGluZ19kaXNvcmRlcnMkbWVhbl9lYXRpbmdfZGlzb3JkZXJzIDwtIHNjYWxlKGVhdGluZ19kaXNvcmRlcnMkbWVhbl9lYXRpbmdfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZWF0aW5nX2Rpc29yZGVycykKCmBgYApgYGB7cn0KIyMjIyMjIyNCaXBvbGFyIGRpc29yZGVyIyMjIyMjIyMjCmJpcG9sYXJfZGlzb3JkZXIgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkJpcG9sYXIgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYmlwb2xhcl9kaXNvcmRlciR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYmlwb2xhcl9kaXNvcmRlciA8LSBiaXBvbGFyX2Rpc29yZGVyICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2JpcG9sYXJfZGlzb3JkZXIgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlciA8LSBsb2coYmlwb2xhcl9kaXNvcmRlciRtZWFuX2JpcG9sYXJfZGlzb3JkZXIpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYmlwb2xhcl9kaXNvcmRlciRtZWFuX2JpcG9sYXJfZGlzb3JkZXIgPC0gc2NhbGUoYmlwb2xhcl9kaXNvcmRlciRtZWFuX2JpcG9sYXJfZGlzb3JkZXIpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChiaXBvbGFyX2Rpc29yZGVyKQoKYGBgCmBgYHtyfQpwcmludChjYXVzZV90YWJsZSkKYGBgCmBgYHtyfQojIyMjIyMjI1N1YnN0YW5jZSB1c2UgZGlzb3JkZXJzIyMjIyMjIyMKCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJTdWJzdGFuY2UgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzIDwtIGxvZyhzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gc2NhbGUoc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMkbWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKYGBgCmBgYHtyfQojIyMjRHJ1ZyB1c2UgZGlzb3JkZXJzCgpkcnVnX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkRydWcgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkcnVnX3VzZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmRydWdfdXNlX2Rpc29yZGVycyA8LSBkcnVnX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzIDwtIGxvZyhkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzIDwtIHNjYWxlKGRydWdfdXNlX2Rpc29yZGVycyRtZWFuX2RydWdfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGRydWdfdXNlX2Rpc29yZGVycykKCgpgYGAKYGBge3J9CiMjIyMjIyMjIyNBbGNvaG9sIHVzZSBkaXNvcmRlcnMKYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBbGNvaG9sIHVzZSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYWxjb2hvbF91c2VfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphbGNvaG9sX3VzZV9kaXNvcmRlcnMgPC0gYWxjb2hvbF91c2VfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBsb2coYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBzY2FsZShhbGNvaG9sX3VzZV9kaXNvcmRlcnMkbWVhbl9hbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgpgYGAKYGBge3J9CiMjIyMjIyNNYWpvciBkZXByZXNzaXZlIGRpc29yZGVycwptYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJNYWpvciBkZXByZXNzaXZlIGRpc29yZGVyIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5Cm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gbG9nKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkbWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkbWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyIDwtIHNjYWxlKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkbWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlcikKCmBgYApgYGB7cn0KIyMjIyMjI0R5c3RoeW1pYSMjIyMjIyMjCgpkeXN0aHltaWEgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkR5c3RoeW1pYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkeXN0aHltaWEkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmR5c3RoeW1pYSA8LSBkeXN0aHltaWEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZHlzdGh5bWlhID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhIDwtIGxvZyhkeXN0aHltaWEkbWVhbl9keXN0aHltaWEpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhIDwtIHNjYWxlKGR5c3RoeW1pYSRtZWFuX2R5c3RoeW1pYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGR5c3RoeW1pYSkKCgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCgojIFBlcmZvcm0gbGVmdCBqb2lucyBmb3IgZWFjaCBkYXRhIGZyYW1lIG9uICdjb3VudHJ5JwpmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4IDwtIG1lbnRhbF9oZWFsdGhfaW5kZXggJT4lCiAgbGVmdF9qb2luKGJ1bGltaWFfbmVydm9zYSwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihBREhELCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihhbm9yZXhpYV9uZXJ2b3NhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGRlcHJlc3NpdmVfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihjb25kdWN0X2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihzY2hpem9waHJlbmlhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGVhdGluZ19kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYmlwb2xhcl9kaXNvcmRlciwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihkcnVnX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYWxjb2hvbF91c2VfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZHlzdGh5bWlhLCBieSA9ICJjb3VudHJ5IikKCiMgRGlzcGxheSB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZmluYWxfbWVudGFsX2hlYWx0aF9pbmRleCkKCiMgU2hvdyB0aGUgZmlyc3QgZmV3IHJvd3Mgb2YgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCmhlYWQoZmluYWxfbWVudGFsX2hlYWx0aF9pbmRleCkKCmBgYApgYGB7cn0KaW5kaWNhdG9ycyA8LSBsZWZ0X2pvaW4oZmluYWxfbWVudGFsX2hlYWx0aF9pbmRleCwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQppbmRpY2F0b3JzCmhlYWQoaW5kaWNhdG9ycykKCm5ld19kYXRhIDwtIGxlZnRfam9pbiAoV1ZTX2RhdGEsIGluZGljYXRvcnMsIGJ5ID0gImNvdW50cnkiKQpuZXdfZGF0YQoKCiMgVHJhbnNmcm9tIHJpc2sgaXRlbSBzdWNoIHRoYXQgaGlnaCB2YWx1ZXMgcmVwcmVzZW50IG1vcmUgcmlzayB0YWtpbmcKbmV3X2RhdGEkcmlza3Rha2luZyA9IDYgLSBuZXdfZGF0YSRyaXNrdGFraW5nICsgMQoKICAKIyBUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFQtc2NvcmUgKG1lYW4gPSA1MCwgc2QgPSAxMCkKbmV3X2RhdGEkVF9zY29yZV9yaXNrdGFraW5nID0gMTAqc2NhbGUobmV3X2RhdGEkcmlza3Rha2luZywgY2VudGVyPVRSVUUsc2NhbGU9VFJVRSkrNTAKCm5ld19kYXRhCgojVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBaIHNjb3JlIAoKIyBBc3N1bWluZyBULXNjb3JlcyBoYXZlIGEgbWVhbiBvZiA1MCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMTAKbmV3X2RhdGEkWl9zY29yZV9yaXNrdGFraW5nID0gKG5ld19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyAtIDUwKSAvIDEwCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChuZXdfZGF0YSkKCm5ld19kYXRhIDwtIG5ld19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCm5ld19kYXRhCmBgYApgYGB7cn0KbGlicmFyeShsbWU0KQoKbGlicmFyeShsbWU0KQoKbW9kZWwgPC0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiBzY2FsZSh6X3Njb3JlX2FnZSkgKiBtZW50YWxfaGVhbHRoICsKICAgICAgICAgICAgICAgZ2VuZGVyICogbWVudGFsX2hlYWx0aCArCiAgICAgICAgICAgICAgIGZhY3RvcihtYXJyaWVkKSArIGZhY3RvcihjaGlsZHJlbikgKwogICAgICAgICAgICAgICBmYWN0b3IoZWR1Y2F0aW9uKSArIGZhY3RvcihlbXBsb3llZCkgKwogICAgICAgICAgICAgICAoMSArIHNjYWxlKHpfc2NvcmVfYWdlKSArIGZhY3RvcihtYXJyaWVkKSArIGZhY3RvcihjaGlsZHJlbikgKyAKICAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSB8IGNvdW50cnkpLAogICAgICAgICAgICAgZGF0YSA9IG5ld19kYXRhLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMCkpKQoKCnN1bW1hcnkobW9kZWwpCgojIEFzc3VtaW5nICdtb2RlbCcgaXMgYSBsaW5lYXIgbWl4ZWQtZWZmZWN0cyBtb2RlbCAobG1lciksIGFuZCB5b3Ugd2FudCB0byBzYXZlIGNvZWZmaWNpZW50cyB0byBhIENTViBmaWxlCgojIEV4dHJhY3QgY29lZmZpY2llbnRzIGZyb20gdGhlIG1vZGVsIHN1bW1hcnkKY29lZmZpY2llbnRzX2RmIDwtIGRhdGEuZnJhbWUoc3VtbWFyeShtb2RlbCkkY29lZmZpY2llbnRzKQoKIyBXcml0ZSBjb2VmZmljaWVudHMgdG8gYSBDU1YgZmlsZQp3cml0ZS5jc3YoY29lZmZpY2llbnRzX2RmLCAibW9kZWxfY29lZmZpY2llbnRzLmNzdiIsIHJvdy5uYW1lcyA9IFRSVUUpCgpgYGAKYGBge3J9CgpgYGAKCgpgYGAKCgoK
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkobWFwcykKbGlicmFyeShoYXZlbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCmhhcmRzaGlwX2NvbXBsZXRlIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9jb2RlL0hhcmRzaGlwX2NvbXBsZXRlXzIwMjQueGxzeCIpCmhhcmRzaGlwX2NvbXBsZXRlCgoKCgpgYGAKYGBge3J9CmhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZT1sb2coaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlKQpoYXJkc2hpcF9jb21wbGV0ZSRnZHA9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJGdkcCkKaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHkpCmhhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeSkKCmhhcmRzaGlwX2NvbXBsZXRlCgojIFJldmVyc2UgQ29kaWVydW5nCmhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZT1zY2FsZShoYXJkc2hpcF9jb21wbGV0ZSRob21pY2lkZXJhdGUpCmhhcmRzaGlwX2NvbXBsZXRlJGdkcD1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkZ2RwKQpoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHk9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5KQpoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeT1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkbGlmZWV4cGVjdGFuY3kpCmhhcmRzaGlwX2NvbXBsZXRlJGdpbmk9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkZ2luaSkKaGFyZHNoaXBfY29tcGxldGUkZmVtYWxlbWFsZV9wcmltZWR1PXNjYWxlKC1oYXJkc2hpcF9jb21wbGV0ZSRmZW1hbGVtYWxlX3ByaW1lZHUpCmhhcmRzaGlwX2NvbXBsZXRlCgpoYXJkc2hpcF9jb21wbGV0ZSRoYXJkc2hpcF9pbmRleD0oaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlK2hhcmRzaGlwX2NvbXBsZXRlJGdkcCtoYXJkc2hpcF9jb21wbGV0ZSRnaW5pK2hhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5K2hhcmRzaGlwX2NvbXBsZXRlJGluZmFudG1vcnRhbGl0eStoYXJkc2hpcF9jb21wbGV0ZSRmZW1hbGVtYWxlX3ByaW1lZHUpLzYKCmhhcmRzaGlwX2NvbXBsZXRlCgojIExhdXJhIGFkZGVkIHRoaXMgY29kZQpsaWJyYXJ5KGRwbHlyKQoKIyBJbXB1dGUgbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGhhcmRzaGlwIGluZGljYXRvcnMgdXNpbmcgdGhlIG1lZGlhbgpoYXJkc2hpcF9jb21wbGV0ZSA8LSBoYXJkc2hpcF9jb21wbGV0ZSAlPiUKICBtdXRhdGUoYWNyb3NzKGMoImhvbWljaWRlcmF0ZSIsICJnZHAiLCAiaW5mYW50bW9ydGFsaXR5IiwgImxpZmVleHBlY3RhbmN5IiwgImdpbmkiLCAiZmVtYWxlbWFsZV9wcmltZWR1IiksCiAgICAgICAgICAgICAgICB+aWZlbHNlKGlzLm5hKC4pLCBtZWRpYW4oLiwgbmEucm0gPSBUUlVFKSwgLikpKQoKaGFyZHNoaXBfY29tcGxldGUKCiMgVXNlIHRoZSBtdXRhdGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjb3VudHJ5IG5hbWUKaGFyZHNoaXBfY29tcGxldGUgPC0gaGFyZHNoaXBfY29tcGxldGUgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UobGFiZWwgPT0gIlNlcmJpYSBhbmQgTW9udGVuZWdybyIsICJTZXJiaWEiLCBsYWJlbCkpCmhhcmRzaGlwX2NvbXBsZXRlCmBgYApgYGB7cn0KIyBDaGVja2luZyBMb2cgVHJhbnNmb3JtYXRpb24gYW5kIFNjYWxpbmcvUmV2ZXJzaW5nOgoKc3VtbWFyeShoYXJkc2hpcF9jb21wbGV0ZVssIGMoImhvbWljaWRlcmF0ZSIsICJnZHAiLCAiaW5mYW50bW9ydGFsaXR5IiwgImxpZmVleHBlY3RhbmN5IildKQojIFZpc3VhbGl6ZSBkaXN0cmlidXRpb25zIGJlZm9yZSBhbmQgYWZ0ZXIgdHJhbnNmb3JtYXRpb24KZ2dwbG90KGhhcmRzaGlwX2NvbXBsZXRlLCBhZXMoeCA9IGdkcCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBHRFAgQmVmb3JlIFRyYW5zZm9ybWF0aW9uIikgKwogIHhsYWIoIkdEUCIpICsgeWxhYigiRnJlcXVlbmN5IikKCmdncGxvdChoYXJkc2hpcF9jb21wbGV0ZSwgYWVzKHggPSBzY2FsZSgtZ2RwKSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBHRFAgQWZ0ZXIgU2NhbGluZy9SZXZlcnNpbmciKSArCiAgeGxhYigiU2NhbGVkL1JldmVyc2VkIEdEUCIpICsgeWxhYigiRnJlcXVlbmN5IikKYGBgCgojIENoZWNraW5nIEVmZmVjdGl2ZW5lc3Mgb2YgSW1wdXRhdGlvbiBNZXRob2QKYGBge3J9CnN1bW1hcnkoaGFyZHNoaXBfY29tcGxldGVbLCBjKCJob21pY2lkZXJhdGUiLCAiZ2RwIiwgImluZmFudG1vcnRhbGl0eSIsICJsaWZlZXhwZWN0YW5jeSIsICJnaW5pIiwgImZlbWFsZW1hbGVfcHJpbWVkdSIpXSkKYGBgCgoKCmBgYHtyfQojIERhdGEgb2YgV2F2ZSA1CgoKV1Y1X2RhdGEgPC0gcmVhZFJEUygiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL0YwMDAwNzk0NC1XVjVfRGF0YV9SX3YyMDE4MDkxMi5yZHMiKQoKCiMgQ29udmVydCBXVjVfZGF0YS1vYmplY3QgaW4gZGF0YS5mcmFtZSAKV1Y1X2RhdGFfZGYgPC0gYXMuZGF0YS5mcmFtZShXVjVfZGF0YSkKCiMgc2hvdyBmaXJzdCBmaXZlIGNvbHVtbnMKV1Y1X2RhdGFfZGYKYGBgCgoKCmBgYHtyfQojcmVuYW1lIHRoZSB2YXJpYWJsZXMKV1Y1X2RhdGEgPC0gV1Y1X2RhdGFfZGYgJT4lCiAgcmVuYW1lKGdlbmRlciA9IFYyMzUsIGFnZSA9IFYyMzcsIGNvdW50cnlfY29kZSA9IFYyLCB3YXZlID0gVjEsIHJpc2t0YWtpbmcgPSBWODYsIGNoaWxkcmVuID0gVjU2LCBtYXJyaWVkID0gVjU1LCBlbXBsb3llZCA9IFYyNDEsIGVkdWNhdGlvbiA9IFYyMzgpCldWNV9kYXRhCgpjb2xuYW1lcyhXVjVfZGF0YSkKCgoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKV1Y1X2RhdGEgPC0gV1Y1X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLCB3YXZlLCByaXNrdGFraW5nLCBjaGlsZHJlbiwgbWFycmllZCwgZW1wbG95ZWQsIGVkdWNhdGlvbikKV1Y1X2RhdGEKCgojIFJlYWQgY291bnRyeW5hbWVzIGRhdGEgZnJvbSB0aGUgQ1NWIGZpbGUgKHRvIGRlY29kZSB0aGUgZGF0YXNldCA1KQpjb3VudHJ5bmFtZXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9jb3VudHJ5bmFtZXMudHh0IiwgaGVhZGVyID0gRkFMU0UsIGFzLmlzID0gVFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA8LSBjKCJjb2RlIiwgIm5hbWUiKQoKCiMgQXNzdW1pbmcgV1Y1X2RhdGEgaGFzIGEgY29sdW1uIG5hbWVkIGNvdW50cnlfY29kZQpXVjVfZGF0YSRjb3VudHJ5IDwtIGNvdW50cnluYW1lcyRuYW1lW21hdGNoKFdWNV9kYXRhJGNvdW50cnlfY29kZSwgY291bnRyeW5hbWVzJGNvZGUpXQoKIyBDaGVjayB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggY291bnRyeSBpbiB0aGUgbmV3IGNvbHVtbgp0YWJsZShXVjVfZGF0YSRjb3VudHJ5KQoKIyBEaXNwbGF5IHRoZSB1cGRhdGVkIFdWNV9kYXRhCnByaW50KFdWNV9kYXRhKQp1bmlxdWUoV1Y1X2RhdGEkY291bnRyeSkKCnByaW50KGNvdW50cnluYW1lcykKCmNvdW50cnlfY291bnRzIDwtIFdWNV9kYXRhICU+JQogIGNvdW50KGNvdW50cnkpCgojIFByaW50IHRoZSByZXN1bHQKcHJpbnQoY291bnRyeV9jb3VudHMpCgoKCmBgYApgYGB7cn0KI1JlYWQgRGF0YXNldCAoV2F2ZSA2KQoKV1Y2X2RhdGEgPC0gbG9hZCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL1dWNl9EYXRhX1JfdjIwMjAxMTE3LnJkYXRhIikgCldWNl9kYXRhIDwtIFdWNl9EYXRhX1JfdjIwMjAxMTE3IApwcmludChXVjZfZGF0YSkKYGBgCgpgYGB7cn0KV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgcmVuYW1lKHdhdmUgPSBWMSwgZ2VuZGVyID0gVjI0MCwgYWdlID0gVjI0Mixjb3VudHJ5X2NvZGUgPSBWMiwgcmlza3Rha2luZyA9IFY3NiwgY2hpbGRyZW4gPSBWNTgsIG1hcnJpZWQgPSBWNTcsIGVtcGxveWVkID0gVjIyOSwgZWR1Y2F0aW9uID0gVjI0OCkKCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdAoKV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdCh3YXZlLCBnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLHJpc2t0YWtpbmcsIGNoaWxkcmVuLCBtYXJyaWVkLCBlbXBsb3llZCwgZWR1Y2F0aW9uKQpXVjZfZGF0YQpgYGAKYGBge3J9CmNvdW50cnluYW1lcyA9IHJlYWQuY3N2KCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlcj1GQUxTRSxhcy5pcz1UUlVFKQpjb2xuYW1lcyhjb3VudHJ5bmFtZXMpID0gYygiY29kZSIsICJuYW1lIikKV1Y2X2RhdGEkY291bnRyeSA9IGNvdW50cnluYW1lcyRuYW1lIFttYXRjaChXVjZfZGF0YSRjb3VudHJ5X2NvZGUsIGNvdW50cnluYW1lcyRjb2RlKV0KdGFibGUoV1Y2X2RhdGEkY291bnRyeSkKV1Y2X2RhdGEKYGBgCmBgYHtyfQoKCgpXVlNfZGF0YSA9IHJiaW5kKFdWNV9kYXRhLCBXVjZfZGF0YSkKV1ZTX2RhdGEKCmNvdW50cnlfY291bnRzIDwtIFdWU19kYXRhICU+JQogIGNvdW50KGNvdW50cnkpCgojIFByaW50IHRoZSByZXN1bHQKcHJpbnQoY291bnRyeV9jb3VudHMpCgoKCgoKCgoKCgpgYGAKYGBge3J9CgoKCgpXVlNfZGF0YSA9IHN1YnNldChXVlNfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNSA9IHN1YnNldChXVjVfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNiA9IHN1YnNldChXVjZfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKV1ZTX2RhdGEgPC0gbmEub21pdChXVlNfZGF0YSkKZGF0YV9XYXZlNSA8LSBuYS5vbWl0KGRhdGFfV2F2ZTUpCmRhdGFfV2F2ZTYgPC0gbmEub21pdChkYXRhX1dhdmU2KQoKCgoKCgoKCgojIFVzZSB0aGUgbXV0YXRlIGZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgY291bnRyeSBuYW1lCldWU19kYXRhIDwtIFdWU19kYXRhICU+JQogIG11dGF0ZShjb3VudHJ5ID0gaWZlbHNlKGNvdW50cnkgPT0gIkdyZWF0IEJyaXRhaW4iLCAiVW5pdGVkIEtpbmdkb20iLCBjb3VudHJ5KSkKYGBgCmBgYHtyfQojIFRyYW5zZnJvbSByaXNrIGl0ZW0gc3VjaCB0aGF0IGhpZ2ggdmFsdWVzIHJlcHJlc2VudCBtb3JlIHJpc2sgdGFraW5nCldWU19kYXRhJHJpc2t0YWtpbmcgPSA2IC0gV1ZTX2RhdGEkcmlza3Rha2luZyArIDEKCiAgCiMgVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBULXNjb3JlIChtZWFuID0gNTAsIHNkID0gMTApCldWU19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyA9IDEwKnNjYWxlKFdWU19kYXRhJHJpc2t0YWtpbmcsIGNlbnRlcj1UUlVFLHNjYWxlPVRSVUUpKzUwCgpXVlNfZGF0YQoKI1RyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gWiBzY29yZSAKCiMgQXNzdW1pbmcgVC1zY29yZXMgaGF2ZSBhIG1lYW4gb2YgNTAgYW5kIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDEwCldWU19kYXRhJFpfc2NvcmVfcmlza3Rha2luZyA9IChXVlNfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgLSA1MCkgLyAxMAoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoV1ZTX2RhdGEpCgpXVlNfZGF0YSA8LSBXVlNfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoel9zY29yZV9hZ2UgPSBzY2FsZShhZ2UpKQpXVlNfZGF0YQoKY291bnRyeV9jb3VudHMgPC0gV1ZTX2RhdGEgJT4lCiAgY291bnQoY291bnRyeSkKCiMgUHJpbnQgdGhlIHJlc3VsdApwcmludChjb3VudHJ5X2NvdW50cykKCgoKCmBgYAoKYGBge3J9CgpXVlNfZGF0YSRnZW5kZXIgPSBpZmVsc2UoV1ZTX2RhdGEkZ2VuZGVyID09IDEsIDAsIDEpICMgc2V4OiBtYWxlIHZzLiBmZW1hbGUKV1ZTX2RhdGEkY2hpbGRyZW4gPSBpZmVsc2UoV1ZTX2RhdGEkY2hpbGRyZW4gPT0gMCwgMCwgMSkgIyBjaGlsZHJlbjogbm8gdnMuIHllcwpXVlNfZGF0YSRtYXJyaWVkID0gaWZlbHNlKFdWU19kYXRhJG1hcnJpZWQgPT0gMSwgMSwgMCkgIyBtYXJyaWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVtcGxveWVkID0gaWZlbHNlKFdWU19kYXRhJGVtcGxveWVkIDwgNCwgMSwgMCkgIyBlbXBsb3llZDogeWVzIHZzLiBubwpXVlNfZGF0YSRlZHVjYXRpb24gPSBpZmVsc2UoV1ZTX2RhdGEkZWR1Y2F0aW9uIDwgNCwgMCwgMSkgIyBlZHVjYXRpb246IG5vIHByaW1hcnkgdnMuIHByaW1hcnkrIAoKCmhhcmRzaGlwIDwtIGhhcmRzaGlwX2NvbXBsZXRlICU+JQogIGRwbHlyOjpzZWxlY3QobGFiZWwsIGNvZGUsIGhhcmRzaGlwX2luZGV4KQpoYXJkc2hpcAoKV1ZTX2RhdGEKCgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmhhcmRzaGlwIDwtIHJlbmFtZShoYXJkc2hpcCwgY291bnRyeSA9IGxhYmVsKQoKV1ZTX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihXVlNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpXVlNfbWl4ZWRfbW9kZWwKaGVhZChXVlNfbWl4ZWRfbW9kZWwpCgpjb2xuYW1lcyhXVlNfZGF0YSkKY29sbmFtZXMoaGFyZHNoaXApCgp1bmlxdWUoV1ZTX2RhdGEkY291bnRyeSkKCldWU19taXhlZF9tb2RlbAoKdW5pcXVlKFdWU19taXhlZF9tb2RlbCRjb3VudHJ5KQpgYGAKYGBge3J9CmxpYnJhcnkobG1lclRlc3QpCgojIGludGVyY2VwdCBvbmx5IG1vZGVsCm1vZGVsMCA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArICgxfGNvdW50cnkpLGRhdGEgPSBXVlNfbWl4ZWRfbW9kZWwpCnN1bW1hcnlfbW9kZWwwPXN1bW1hcnkobW9kZWwwKQpzdW1tYXJ5X21vZGVsMApgYGAKYGBge3J9CiMgYWdlLCBzZXggCm1vZGVsMSA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArc2NhbGUoYWdlKStmYWN0b3IoZ2VuZGVyKSArICgxK3NjYWxlKGFnZSkrZmFjdG9yKGdlbmRlcil8Y291bnRyeSksZGF0YSA9IFdWU19taXhlZF9tb2RlbCwgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDApKSkKc3VtbWFyeV9tb2RlbDE9c3VtbWFyeShtb2RlbDEpCnN1bW1hcnlfbW9kZWwxCmBgYAoKYGBge3J9CiNtb2RlbCAyCmxpYnJhcnkobG1lNCkKCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKCiMgRGVmaW5lIHRoZSBsbWVyIG1vZGVsIGFuZCBhc3NpZ24gaXQgdG8gJ21vZGVsXzInCgpvcHRpb25zKHNjaXBlbiA9IDEwMCkKbW9kZWxfMiA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pICsgKDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMCkpKQoKCiMgRGlzcGxheSB0aGUgc3VtbWFyeSBvZiB0aGUgbW9kZWwKc3VtbWFyeV9tb2RlbF8yID0gc3VtbWFyeShtb2RlbF8yKQpzdW1tYXJ5X21vZGVsXzIKCldWU19taXhlZF9tb2RlbAoKCmBgYAoKCmBgYHtyfQpvcHRpb25zKHNjaXBlbiA9IDEwMCkKbW9kZWxfMyA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICogaGFyZHNoaXBfaW5kZXggKyAKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZ2VuZGVyKSAqIGhhcmRzaGlwX2luZGV4ICsgZmFjdG9yKGNoaWxkcmVuKSArIGZhY3RvcihtYXJyaWVkKSArIGZhY3RvcihlbXBsb3llZCkgKyBmYWN0b3IoZWR1Y2F0aW9uKSArIAogICAgICAgICAgICAgICAgICAgICgxICsgc2NhbGUoYWdlKSArIGZhY3RvcihnZW5kZXIpKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLGNvbnRyb2w9bG1lckNvbnRyb2wob3B0Q3RybD1saXN0KG1heGZ1bj0xMDAwMDApLG9wdGltaXplcj0iYm9ieXFhIiksUkVNTCA9IEZBTFNFKQoKc3VtbWFyeV9tb2RlbF8zID0gc3VtbWFyeShtb2RlbF8zKSAKCnN1bW1hcnlfbW9kZWxfMwoKCmBgYAoKYGBge3J9CiMgRGVmaW5lIGFub3ZhX3Jlc3VsdHMgbGlzdCB3aXRoIG11bHRpcGxlIGFub3ZhKCkgY2FsbHMKYW5vdmFfcmVzdWx0cyA8LSBsaXN0KAogIGFub3ZhKG1vZGVsMCwgbW9kZWwxKSwKICBhbm92YShtb2RlbDEsIG1vZGVsXzIpLAogIGFub3ZhKG1vZGVsXzIsIG1vZGVsXzMpCikKCmFub3ZhX3Jlc3VsdHMKCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkodGliYmxlKQoKCgpsaWJyYXJ5KGRwbHlyKQojIEZvcm1hdCBBTk9WQSByZXN1bHRzIGludG8gYSB0aWR5IGRhdGEgZnJhbWUKYW5vdmFfc3VtbWFyeSA8LSBiaW5kX3Jvd3MobGFwcGx5KGFub3ZhX3Jlc3VsdHMsIHRpZHkpLCAuaWQgPSAiQ29tcGFyaXNvbiIpCgojIFByaW50IHRoZSBzdW1tYXJ5IHRhYmxlCnByaW50KGFub3ZhX3N1bW1hcnkpCgpgYGAKYGBge3J9CiMgRXh0cmFjdCByYW5kb20gZWZmZWN0cyBmb3IgJ2NvdW50cnknCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyB5b3VyIGZpdHRlZCBsbWVyIG1vZGVsCnJhbmRvbV9lZmZlY3RzIDwtIHJhbmVmKG1vZGVsXzIpCnJhbmRvbV9lZmZlY3RzCgoKCgoKCmBgYApgYGB7cn0KcmVncmVzc2lvbl9yZXN1bHRzX1dWUyA8LSBXVlNfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBkbyhtb2RlbCA9IGxtKFpfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKGFnZSkgKyBnZW5kZXIsIGRhdGEgPSAuKSkgJT4lCiAgc3VtbWFyaXplKAogICAgY291bnRyeSA9IGZpcnN0KGNvdW50cnkpLAogICAgaW50ZXJjZXB0X3JlZ3Jlc3Npb24gPSBjb2VmKHN1bW1hcnkobW9kZWwpKVsxLCAxXSwKICAgIHNsb3BlX2FnZV9yZWdyZXNzaW9uID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMiwgMV0sCiAgICBzbG9wZV9nZW5kZXJfcmVncmVzc2lvbiA9IGNvZWYoc3VtbWFyeShtb2RlbCkpWzMsIDFdCiAgKQoKcmVncmVzc2lvbl9yZXN1bHRzX1dWUwoKcmFuZG9tX2VmZmVjdHMgPC0gcmFuZWYobW9kZWxfMikKcmFuZG9tX2VmZmVjdHMKCmNvbG5hbWVzKHJhbmRvbV9lZmZlY3RzKQoKCgoKCgoKCgoKCgoKCgoKYGBgCgpgYGB7cn0KY29lZnNhbGxtb2RlbHM9cmJpbmQoc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzIkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzMkY29lZmZpY2llbnRzW2MoMToyLDQ6OCwzLDk6MTApLF0pCgp3cml0ZS5jc3YoY29lZnNhbGxtb2RlbHMsImNvZWZzYWxsbW9kZWxzLmNzdiIpCmBgYAoKCmBgYHtyfQojIFJlYWQgdGhlIENTViBmaWxlIGludG8gYSBkYXRhIGZyYW1lCmdiZF9tZW50YWxoZWFsdGggPC0gcmVhZF9leGNlbCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL0dCRF9tZW50YWxoZWFsdGgueGxzeCIpCgpnYmRfbWVudGFsaGVhbHRoCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApnYmRfbWVudGFsaGVhbHRoIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBnZW5kZXIsIGFnZSwgY2F1c2UsIHZhbCwgTWVhc3VyZSkKZ2JkX21lbnRhbGhlYWx0aAoKCmxpYnJhcnkoZHBseXIpCgojIEdyb3VwIGRhdGEgYnkgY291bnRyeSBhbmQgYWdlIGdyb3VwLCBhbmQgY2FsY3VsYXRlIHN1bW1hcnkgc3RhdGlzdGljcwpzdW1tYXJ5X2J5X2NvdW50cnlfYWdlIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuX0RBTFlzID0gbWVhbih2YWwpKSAgIyBDYWxjdWxhdGUgbWVhbiBvZiBEQUxZcwoKbGlicmFyeShkcGx5cikKCiMgQXNzdW1pbmcgJ3N1bW1hcnlfYnlfY291bnRyeV9hZ2UnIGNvbnRhaW5zIHlvdXIgc3VtbWFyaXplZCBkYXRhc2V0Cm1lYW5fYnlfY291bnRyeSA8LSBzdW1tYXJ5X2J5X2NvdW50cnlfYWdlICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0RBTFlzID0gbWVhbihtZWFuX0RBTFlzKSkKCiMgVmlldyB0aGUgcmVzdWx0aW5nIG1lYW4gYnkgY291bnRyeQpwcmludChtZWFuX2J5X2NvdW50cnkpCgojbG9nIHRyYW5zZm9ybQptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1sb2cobWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXMpCiAKbWVhbl9ieV9jb3VudHJ5IAoKI1JldmVyc2UgY29kaWVydW5nIAptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1zY2FsZShtZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcykKCm1lYW5fYnlfY291bnRyeQoKI3JlbmFtZSBtZWFuX0RBTFlTCm1lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVhbl9ieV9jb3VudHJ5ICU+JQogIHJlbmFtZSgnbWVudGFsX2hlYWx0aCcgPSBtZWFuX0RBTFlzKQptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCgojIyMjIyMjQW54aWV0eSBkaXNvcmRlcnMjIyMjIyMjIyMKI0ZpbHRlciBkYXRhIGZvciBhIHNwZWNpZmljIG1lbnRhbCBkaXNvcmRlciAoZS5nLiwgQW54aWV0eSBEaXNvcmRlcnMpCmFueGlldHlfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBbnhpZXR5IGRpc29yZGVycyIpICAjIENoYW5nZSAiQW54aWV0eSBEaXNvcmRlcnMiIHRvIHRoZSBkZXNpcmVkIGRpc29yZGVyCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoRGlzYWJpbGl0eS1BZGp1c3RlZCBMaWZlIFllYXJzKSBhY3Jvc3MgbG9jYXRpb25zIGFuZCBhZ2VzCm1lYW5fREFMWXMgPC0gbWVhbihhbnhpZXR5X2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGlmIHlvdSB3YW50IHRvIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnk6CmFueGlldHlfZGlzb3JkZXJzIDwtIGFueGlldHlfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0FueGlldHlfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKYW54aWV0eV9kaXNvcmRlcnMKCiNsb2cgdHJhbnNmb3JtCmFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnM9bG9nKGFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnMpCiAKYW54aWV0eV9kaXNvcmRlcnMKCiNSZXZlcnNlIGNvZGllcnVuZyAKYW54aWV0eV9kaXNvcmRlcnMkbWVhbl9BbnhpZXR5X2Rpc29yZGVycz1zY2FsZShhbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzKQphbnhpZXR5X2Rpc29yZGVycwptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmdiZF9tZW50YWxoZWFsdGgKCiMgQXNzdW1pbmcgZ2JkX21lbnRhbGhlYWx0aCBpcyB5b3VyIGRhdGEgZnJhbWUgY29udGFpbmluZyB0aGUgJ2NhdXNlJyBjb2x1bW4KCiMgR2V0IHVuaXF1ZSB2YWx1ZXMgb2YgJ2NhdXNlJyBjb2x1bW4KdW5pcXVlX2NhdXNlcyA8LSB1bmlxdWUoZ2JkX21lbnRhbGhlYWx0aCRjYXVzZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHVuaXF1ZSBjYXVzZXMKY2F1c2VfdGFibGUgPC0gZGF0YS5mcmFtZShDYXVzZSA9IHVuaXF1ZV9jYXVzZXMpCgojIFByaW50IHRoZSBjYXVzZSB0YWJsZQpwcmludChjYXVzZV90YWJsZSkKCgpgYGAKYGBge3J9CiMjIyMjIyNCdWxpbWlhIG5lcnZvc2EjIyMjIyMjIwpsaWJyYXJ5KGRwbHlyKQoKIyBGaWx0ZXIgdGhlIGRhdGEgZm9yICdCdWxpbWlhIE5lcnZvc2EnCmJ1bGltaWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQnVsaW1pYSBuZXJ2b3NhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGJ1bGltaWFfbmVydm9zYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYnVsaW1pYV9uZXJ2b3NhIDwtIGJ1bGltaWFfbmVydm9zYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9idWxpbWlhX25lcnZvc2EgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gbG9nKGJ1bGltaWFfbmVydm9zYSRtZWFuX2J1bGltaWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gc2NhbGUoYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoYnVsaW1pYV9uZXJ2b3NhKQpwcmludChhbnhpZXR5X2Rpc29yZGVycykKCmdiZF9tZW50YWxoZWFsdGgKCmBgYApgYGB7cn0KIyMjIyNBdHRlbnRpb24tZGVmaWNpdC9oeXBlcmFjdGl2aXR5IGRpc29yZGVyCmxpYnJhcnkoZHBseXIpCgoKQURIRCA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQXR0ZW50aW9uLWRlZmljaXQvaHlwZXJhY3Rpdml0eSBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihBREhEJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpBREhEIDwtIEFESEQgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fQURIRCA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCkFESEQkbWVhbl9BREhEIDwtIGxvZyhBREhEJG1lYW5fQURIRCkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpBREhEJG1lYW5fQURIRCA8LSBzY2FsZShBREhEJG1lYW5fQURIRCkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KEFESEQpCgpgYGAKYGBge3J9CiMjIyMjIyMjI0lkaW9wYXRoaWMgZGV2ZWxvcG1lbnQgaW50ZWxsZWN0dWFsIGFiaWxpdHkgCmxpYnJhcnkoZHBseXIpCgoKSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5IDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJJZGlvcGF0aGljIGRldmVsb3BtZW50YWwgaW50ZWxsZWN0dWFsIGRpc2FiaWxpdHkiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5ICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBsb2coSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JG1lYW5fSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBzY2FsZShJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCmBgYApgYGB7cn0KIyMjIyMjQW5vcmV4aWEgTmVydm9zYQoKYW5vcmV4aWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQW5vcmV4aWEgbmVydm9zYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbm9yZXhpYV9uZXJ2b3NhJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphbm9yZXhpYV9uZXJ2b3NhIDwtIGFub3JleGlhX25lcnZvc2EgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYW5vcmV4aWFfbmVydm9zYSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmFub3JleGlhX25lcnZvc2EkbWVhbl9hbm9yZXhpYV9uZXJ2b3NhIDwtIGxvZyhhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQphbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSA8LSBzY2FsZShhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFub3JleGlhX25lcnZvc2EpCmBgYApgYGB7cn0KIyMjIyNEZXByZXNzaXZlIGRpc29yZGVycyMjIyMjIyMKCmRlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJEZXByZXNzaXZlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkZXByZXNzaXZlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gZGVwcmVzc2l2ZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGxvZyhkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmRlcHJlc3NpdmVfZGlzb3JkZXJzJG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gc2NhbGUoZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGRlcHJlc3NpdmVfZGlzb3JkZXJzKQpgYGAKCmBgYHtyfQojIyMjIyMjQXV0aXNtdXMgc3BlY3RydW0gZGlzb3JkZXJzIyMjIyMjCgphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkF1dGlzbSBzcGVjdHJ1bSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBsb2coYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJG1lYW5fYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBzY2FsZShhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCmBgYAoKYGBge3J9CiMjIyMjI1NjaGl6b3BocmVuaWEjIyMjIyMjCnNjaGl6b3BocmVuaWEgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlNjaGl6b3BocmVuaWEiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oc2NoaXpvcGhyZW5pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKc2NoaXpvcGhyZW5pYSA8LSBzY2hpem9waHJlbmlhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX3NjaGl6b3BocmVuaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpzY2hpem9waHJlbmlhJG1lYW5fc2NoaXpvcGhyZW5pYSA8LSBsb2coc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEgPC0gc2NhbGUoc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChzY2hpem9waHJlbmlhKQoKYGBgCgpgYGB7cn0KIyMjIyMjI0NvbmR1Y3QgZGlzb3JkZXJzIyMjIyMjIyMjCmNvbmR1Y3RfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJDb25kdWN0IGRpc29yZGVyIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGNvbmR1Y3RfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpjb25kdWN0X2Rpc29yZGVycyA8LSBjb25kdWN0X2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9jb25kdWN0X2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPC0gbG9nKGNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKY29uZHVjdF9kaXNvcmRlcnMkbWVhbl9jb25kdWN0X2Rpc29yZGVycyA8LSBzY2FsZShjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoY29uZHVjdF9kaXNvcmRlcnMpCgoKYGBgCgpgYGB7cn0KIyMjIyMjIyNFYXRpbmcgZGlzb3JkZXJzIyMjIyMjIyMjCmVhdGluZ19kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkVhdGluZyBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oZWF0aW5nX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZWF0aW5nX2Rpc29yZGVycyA8LSBlYXRpbmdfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2VhdGluZ19kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgplYXRpbmdfZGlzb3JkZXJzJG1lYW5fZWF0aW5nX2Rpc29yZGVycyA8LSBsb2coZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMgPC0gc2NhbGUoZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChlYXRpbmdfZGlzb3JkZXJzKQoKYGBgCmBgYHtyfQojIyMjIyMjI0JpcG9sYXIgZGlzb3JkZXIjIyMjIyMjIyMKYmlwb2xhcl9kaXNvcmRlciA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQmlwb2xhciBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihiaXBvbGFyX2Rpc29yZGVyJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpiaXBvbGFyX2Rpc29yZGVyIDwtIGJpcG9sYXJfZGlzb3JkZXIgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYmlwb2xhcl9kaXNvcmRlciA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmJpcG9sYXJfZGlzb3JkZXIkbWVhbl9iaXBvbGFyX2Rpc29yZGVyIDwtIGxvZyhiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlciA8LSBzY2FsZShiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGJpcG9sYXJfZGlzb3JkZXIpCgpgYGAKYGBge3J9CnByaW50KGNhdXNlX3RhYmxlKQpgYGAKYGBge3J9CiMjIyMjIyMjU3Vic3RhbmNlIHVzZSBkaXNvcmRlcnMjIyMjIyMjIwoKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlN1YnN0YW5jZSB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gbG9nKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMkbWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzY2FsZShzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgpgYGAKYGBge3J9CiMjIyNEcnVnIHVzZSBkaXNvcmRlcnMKCmRydWdfdXNlX2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHJ1ZyB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGRydWdfdXNlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHJ1Z191c2VfZGlzb3JkZXJzIDwtIGRydWdfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gbG9nKGRydWdfdXNlX2Rpc29yZGVycyRtZWFuX2RydWdfdXNlX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gc2NhbGUoZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHJ1Z191c2VfZGlzb3JkZXJzKQoKCmBgYApgYGB7cn0KIyMjIyMjIyMjI0FsY29ob2wgdXNlIGRpc29yZGVycwphbGNvaG9sX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkFsY29ob2wgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmFsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBhbGNvaG9sX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIGxvZyhhbGNvaG9sX3VzZV9kaXNvcmRlcnMkbWVhbl9hbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIHNjYWxlKGFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFsY29ob2xfdXNlX2Rpc29yZGVycykKCmBgYApgYGB7cn0KIyMjIyMjI01ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXJzCm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIk1ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgptYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyJG1lYW5fbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBsb2cobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gc2NhbGUobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKYGBgCmBgYHtyfQojIyMjIyMjRHlzdGh5bWlhIyMjIyMjIyMKCmR5c3RoeW1pYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHlzdGh5bWlhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGR5c3RoeW1pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHlzdGh5bWlhIDwtIGR5c3RoeW1pYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9keXN0aHltaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gbG9nKGR5c3RoeW1pYSRtZWFuX2R5c3RoeW1pYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gc2NhbGUoZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHlzdGh5bWlhKQoKCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKCiMgUGVyZm9ybSBsZWZ0IGpvaW5zIGZvciBlYWNoIGRhdGEgZnJhbWUgb24gJ2NvdW50cnknCmZpbmFsX21lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVudGFsX2hlYWx0aF9pbmRleCAlPiUKICBsZWZ0X2pvaW4oYnVsaW1pYV9uZXJ2b3NhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKEFESEQsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5LCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGFub3JleGlhX25lcnZvc2EsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZGVwcmVzc2l2ZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGNvbmR1Y3RfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKHNjaGl6b3BocmVuaWEsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZWF0aW5nX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihiaXBvbGFyX2Rpc29yZGVyLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGRydWdfdXNlX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihkeXN0aHltaWEsIGJ5ID0gImNvdW50cnkiKQoKIyBEaXNwbGF5IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKIyBTaG93IHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKaGVhZChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKYGBgCmBgYHtyfQppbmRpY2F0b3JzIDwtIGxlZnRfam9pbihmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4LCBoYXJkc2hpcCwgYnkgPSAiY291bnRyeSIpCmluZGljYXRvcnMKaGVhZChpbmRpY2F0b3JzKQoKbmV3X2RhdGEgPC0gbGVmdF9qb2luIChXVlNfZGF0YSwgaW5kaWNhdG9ycywgYnkgPSAiY291bnRyeSIpCm5ld19kYXRhCgoKIyBUcmFuc2Zyb20gcmlzayBpdGVtIHN1Y2ggdGhhdCBoaWdoIHZhbHVlcyByZXByZXNlbnQgbW9yZSByaXNrIHRha2luZwpuZXdfZGF0YSRyaXNrdGFraW5nID0gNiAtIG5ld19kYXRhJHJpc2t0YWtpbmcgKyAxCgogIAojIFRyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gVC1zY29yZSAobWVhbiA9IDUwLCBzZCA9IDEwKQpuZXdfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgPSAxMCpzY2FsZShuZXdfZGF0YSRyaXNrdGFraW5nLCBjZW50ZXI9VFJVRSxzY2FsZT1UUlVFKSs1MAoKbmV3X2RhdGEKCiNUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFogc2NvcmUgCgojIEFzc3VtaW5nIFQtc2NvcmVzIGhhdmUgYSBtZWFuIG9mIDUwIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxMApuZXdfZGF0YSRaX3Njb3JlX3Jpc2t0YWtpbmcgPSAobmV3X2RhdGEkVF9zY29yZV9yaXNrdGFraW5nIC0gNTApIC8gMTAKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KG5ld19kYXRhKQoKbmV3X2RhdGEgPC0gbmV3X2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHpfc2NvcmVfYWdlID0gc2NhbGUoYWdlKSkKbmV3X2RhdGEKYGBgCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCgpsaWJyYXJ5KGxtZTQpCgptb2RlbCA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKHpfc2NvcmVfYWdlKSAqIG1lbnRhbF9oZWFsdGggKwogICAgICAgICAgICAgICBnZW5kZXIgKiBtZW50YWxfaGVhbHRoICsKICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArCiAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSArCiAgICAgICAgICAgICAgICgxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpIHwgY291bnRyeSksCiAgICAgICAgICAgICBkYXRhID0gbmV3X2RhdGEsIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMTAwMDAwKSkpCgoKc3VtbWFyeShtb2RlbCkKCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyBhIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVsIChsbWVyKSwgYW5kIHlvdSB3YW50IHRvIHNhdmUgY29lZmZpY2llbnRzIHRvIGEgQ1NWIGZpbGUKCiMgRXh0cmFjdCBjb2VmZmljaWVudHMgZnJvbSB0aGUgbW9kZWwgc3VtbWFyeQpjb2VmZmljaWVudHNfZGYgPC0gZGF0YS5mcmFtZShzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHMpCgojIFdyaXRlIGNvZWZmaWNpZW50cyB0byBhIENTViBmaWxlCndyaXRlLmNzdihjb2VmZmljaWVudHNfZGYsICJtb2RlbF9jb2VmZmljaWVudHMuY3N2Iiwgcm93Lm5hbWVzID0gVFJVRSkKCmBgYApgYGB7cn0KCmBgYAoKCmBgYAoKCgo=